数据结构之链表

链表数据结构图解 项目中经常会用到LinkedList集合来存储数据,打算写一篇LinkedList的源码解析,而LinkedList是基于链表结构存储数据的,这篇博文将解析链表数据结构,包括单向链表和双向链表; 1:单向链表: 单向链表的链表对象维护了一个 first 引用,该引用指向节点链表中的第一个节点对象,每个节点对象维护一个 next 引用,next引用指向下一个节点对象;(这里注意:是引用指向的是节点对... 阅读详情

数据结构重点在于存储数据

一顺序表,存储元素的时候可以通过o(1)实现

表头:容量,个数     例如: int类型 4byte(4字节)  32位

数据区:所存放的数据

二链表:节点与节点直接靠链表联系,不需要预定内存。不需要连续的内存,每个节点包含两个域,一个是数据区,链接区

单向链表:链表的方向是单向的,从头指向尾

对于python  a=10指的是a的地址指向10

对于c       int a=10 指的是a的存储空间放进了10

链表和顺序表对比

1链表与顺序表都是线性表,

顺序表:将元素顺序地存放在一块连续的存储区域,元素箭的顺序关系有他们的存储顺序自然表示

链表:将元素存放在通过链表构造起来的一系列存储块中

时间复杂度对比:

操作链表顺序表
访问元素o(n)o(1)
在头部插入/删除o(1)o(n)
在尾部插入/删除o(n)o(1)
在中间插入/删除o(n)o(n)

单链表

class Node(object):
    def __init__(self,elem):
        self.elem=elem
        self.next=None
class SingleLinkList(object):
    def __init__(self,node=None):
        self._head=node
    #判断链表是否为空
    def is_empty(self):
        return self._head==None

    #链表长度
    def length(self):
        #cur游标,用来移动遍历节点
        cur=self._head
        #count记录数量
        count=0
        while cur!=None:
            count += 1
            cur=cur.next
        return count

    #遍历整个链表
    def travel(self):
        cur=self._head
        while cur!=None:
            print(cur.elem,end=' ')
            cur=cur.next


    #链表头部添加元素,item是具体的数值,所以一开始需要把item封装成节点
    def add(self,item):
        node=Node(item)
        node.next=self._head
        self._head=node



    #链表尾部添加元素
    def append(self,item):
        node=Node(item)
        if self.is_empty():
            self._head=node
        else:
            cur=self._head
            while cur.next!=None:
                cur=cur.next
            cur.next=node

    #指定位置添加元素
    def insert(self,pos,item):
        if pos<=0:
            self.add(item)
        elif pos>=self.length():
            self.append(item)
        else:
            node=Node(item)
            count=0
            pre=self._head
            while count<pos:
                count+=1
                pre=pre.next
            node.next=pre.next
            pre.next=node

    # #删除节点
    def remove(self,item):
        cur=self._head
        pre=None
        while cur!=None:
            if cur.elem==item:
                if cur==self._head:
                    #先判断此节点是否是头结点
                    self._head=cur.next
                else:
                    pre.next=cur.next
                    # pre.next=pre.next.next
                break
            else:
                pre=cur
                cur=cur.next

    #查找节点是否存在
    def search(self,item):
        cur=self._head
        while cur.next!=None:
            if cur.elem==item:
                return True
            else:
                cur=cur.next
        return False


if __name__=='__main__':

    ll=SingleLinkList()
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.insert(-1,0)
    ll.append(4)
    ll.add(9)
    ll.append(7)
    ll.append(1)
    ll.travel()
    print('\n')

    ll.remove(9)
    ll.travel()
    print('\n')
    ll.remove(7)
    ll.travel()
    print('\n')

三双向链表,头指向尾,尾指向头,前驱节点pre,数据,后继节点next

#链表头部添加元素,item是具体的数值,所以一开始需要把item封装成节点
def add(self,item):
    node=Node(item)
    node.next=self._head
    self._head=node
    node.next.pre=node
    # node=Node(item)
    # node.next=self._head
    # self._head.pre=node
    # self._head=node
        

 #链表尾部添加元素
def append(self,item):
   node=Node(item)
   if self.is_empty():
       self._head=node
   else:
       cur=self._head
       while cur.next!=None:
           cur=cur.next
       cur.next=node
       node.pre=cur

 #指定位置添加元素
def insert(self,pos,item):
    if pos<=0:
        self.add(item)
    elif pos>=self.length():
        self.append(item)
    else:
        node=Node(item)
        count=0
        cur=self._head
        while count<pos:
            count+=1
            cur=cur.next
        node.next=cur
        node.pre=cur.pre
        cur.pre.next=node
        cur.pre=node
        # node.next = cur
        # node.pre = cur.pre
        # cur.pre = node
        # node.pre.next = node

# #删除节点
def remove(self,item):
    cur=self._head
    while cur!=None:
        if cur.elem==item:
            if cur==self._head:
                #先判断此节点是否是头结点
                self._head=cur.next
                #判断是否只有一个节点
                if cur.next:
                    cur.next.pre=None
            else:
                cur.pre.next=cur.next
                if cur.next:
                    cur.next.pre=cur.pre
            break
        else:
            cur=cur.next
class Node(object):
    def __init__(self,elem):
        self.elem=elem
        self.next=None
        self.pre=None
class DoubleLinkList(object):
    def __init__(self,node=None):
        self._head=node
    #判断链表是否为空
    def is_empty(self):
        return self._head==None

    #链表长度
    def length(self):
        #cur游标,用来移动遍历节点
        cur=self._head
        #count记录数量
        count=0
        while cur!=None:
            count += 1
            cur=cur.next
        return count

    #遍历整个链表
    def travel(self):
        cur=self._head
        while cur!=None:
            print(cur.elem,end=' ')
            cur=cur.next

    #链表头部添加元素,item是具体的数值,所以一开始需要把item封装成节点
    def add(self,item):
        node=Node(item)
        node.next=self._head
        self._head=node
        node.next.pre=node
        # node=Node(item)
        # node.next=self._head
        # self._head.pre=node
        # self._head=node

    #链表尾部添加元素
    def append(self,item):
        node=Node(item)
        if self.is_empty():
            self._head=node
        else:
            cur=self._head
            while cur.next!=None:
                cur=cur.next
            cur.next=node
            node.pre=cur

    #指定位置添加元素
    def insert(self,pos,item):
        if pos<=0:
            self.add(item)
        elif pos>=self.length():
            self.append(item)
        else:
            node=Node(item)
            count=0
            cur=self._head
            while count<pos:
                count+=1
                cur=cur.next
            node.next=cur
            node.pre=cur.pre
            cur.pre.next=node
            cur.pre=node
            # node.next = cur
            # node.pre = cur.pre
            # cur.pre = node
            # node.pre.next = node

    # #删除节点
    def remove(self,item):
        cur=self._head
        while cur!=None:
            if cur.elem==item:
                if cur==self._head:
                    #先判断此节点是否是头结点
                    self._head=cur.next
                    #判断是否只有一个节点
                    if cur.next:
                        cur.next.pre=None
                else:
                    cur.pre.next=cur.next
                    if cur.next:
                        cur.next.pre=cur.pre
                break
            else:
                cur=cur.next

    #查找节点是否存在
    def search(self,item):
        cur=self._head
        while cur.next!=None:
            if cur.elem==item:
                return True
            else:
                cur=cur.next
        return False


if __name__=='__main__':

    dll=DoubleLinkList()
    print(dll.is_empty())
    print(dll.length())

    dll.append(2)
    dll.insert(-1,0)
    dll.append(4)
    dll.add(9)
    dll.append(7)
    dll.append(1)
    dll.travel()
    print('\n')
    dll.insert(10,200)
    dll.travel()
    print('\n')
    dll.remove(9)
    dll.travel()
    print('\n')
    dll.remove(7)
    dll.travel()
    print('\n')
    dll.remove(200)
    dll.travel()

四单链表循环

 #链表头部添加元素,链表为空,链表只有一个元素,多个元素
def add(self,item):
    node=Node(item)
    if self._head==None:
        self._head=node
        node.next=node
    else:
        cur=self._head
        while cur.next!=self._head:
            cur=cur.next
        #退出循环,cur指向尾结点
        node.next=self._head
        self._head=node
        cur.next=self._head
class Node(object):
    def __init__(self,elem):
        self.elem=elem
        self.next=None
class SingleCycleLinkList(object):
    def __init__(self,node=None):
        self._head=node
        if node:
            node.next=node
    #判断链表是否为空
    def is_empty(self):
        return self._head==None

    #链表长度
    def length(self):
        if self.is_empty():
            return 0
        #cur游标,用来移动遍历节点
        cur=self._head
        #count记录数量
        count=1
        while cur.next!=self._head:
            count += 1
            cur=cur.next
        return count

    #遍历整个链表
    def travel(self):
        cur=self._head
        while cur.next!=self._head:
            print(cur.elem)
            cur=cur.next
       #退出循环,cur指向尾结点,但尾结点的元素未打印
        print(cur.elem, end=' ')
        print('')


    #链表头部添加元素,item是具体的数值,所以一开始需要把item封装成节点
    def add(self,item):
        node=Node(item)
        if self._head==None:
            self._head=node
            node.next=node
        else:
            cur=self._head
            while cur.next!=self._head:
                cur=cur.next
            #退出循环,cur指向尾结点
            node.next=self._head
            self._head=node
            cur.next=self._head

    #链表尾部添加元素
    def append(self,item):
        node=Node(item)
        if self.is_empty():
            self._head=node
            node.next=node
        else:
            cur=self._head
            while cur.next!=self._head:
                cur=cur.next
            node.next=self._head
            cur.next=node

    #指定位置添加元素
    def insert(self,pos,item):
        if pos<=0:
            self.add(item)
        elif pos>=self.length():
            self.append(item)
        else:
            node=Node(item)
            count=0
            pre=self._head
            while count<pos:
                count+=1
                pre=pre.next
            node.next=pre.next
            pre.next=node

    # #删除节点
    def remove(self,item):
        if self.is_empty():
            return
        cur=self._head
        pre=None
        while cur.next!=self._head:
            if cur.elem==item:
                # 先判断此节点是否是头结点
                if cur==self._head:
                    #头结点的情况找尾结点
                    rear=self._head
                    while rear.next!=self._head:
                        rear=self._head
                    self._head=cur.next
                    rear.next=self._head
                else:
                    #中间节点
                    pre.next=cur.next
                break
            else:
                pre=cur
                cur=cur.next
        if cur.elem==item:
            if cur==self._head:
                self._head=None
            else:
                pre.next=cur.next
    #查找节点是否存在
    def search(self,item):
        cur=self._head
        while cur.next!=self._head:
            if cur.elem==item:
                return True
            else:
                cur=cur.next
        if cur.elem==item:
            return True
        return False


if __name__=='__main__':

    ll=SingleCycleLinkList()
    print(ll.is_empty())
    print(ll.length())

    ll.append(2)
    ll.insert(-1,0)
    ll.append(4)
    ll.add(9)
    ll.append(7)
    ll.append(1)
    ll.travel()
    print('\n')

    ll.remove(9)
    ll.travel()
    print('\n')
    ll.remove(7)
    ll.travel()
    print('\n')

[数据结构]链表之单链表 单链表是一种常见的线性数据结构,由若干个节点组成,每个节点包含两部分:数据元素和指向下一个节点的指针。每个节点只有一个指针,通常称为 next 指针,它指向该节点的后继节点。头节点是第一个节点前面额外添加的一个节点,它不包含数据元素,但是包含对第一个节点的指针。单链表可以表示任意长度的序列,可以动态地插入、删除节点,使其具有灵活性和高效性。但由于每个节点只有一个指针,因此单链表只能从前往后遍历,不能反向遍历。以下是单链表常用的操作:创建链表:创建一个空链表,可选是否带有头节点。 阅读详情

相关推荐

【答读者问51】谈一谈策略(strategy)使用多数据的时候prenext和next的区别

对策略的一些关键函数做了讲解,重新copy到这里,可以看到,在策略初始化的时候,会运行__init__中的一些代码,接下来会运行start,一般情况下,是只运行一次,接下来就是比较关键的prenext了,如果多数据的时候,这些数据的日期并不一致,将会导致不会进入到next中,会一直在prenext中运行,直到所有的数据日期都有了之后,才会进入到next中。这个是前段有一个读者咨询过的问题,记录下来了,一直没有写成文章,主要是感觉太简单了,没有必要写成一个单独的文章。...

云金杞 1341

链表

链表 单链表 (1)直接在链表尾部插入 (2)按编号从小到大插入 (3)按编号删除节点 class Node //节点 { public int no; public String name; public Node next; //指向后一个节点 public Node(int no, String name) //构造函数 { this.no = no; this.name = name; } } class SingleLinkedList { private Node h

qq_21990511的博客 202

服务器报错:“Unhealthy status reported by this UEFI driver without specific error message”.. 记录解决过程

服务器开机报错:Unhealthy status reported by this UEFI driver without specific...

ayychiguoguo的博客 4398

pre和next功能类推

省略。。。 转载于:https://www.cnblogs.com/learning-python/p/10279820.html

weixin_30908941的博客 582

莫兰指数stata命令_一文读懂16个sp系列stata空间计量命令及应用

spcompress:Compress Stata-format shapefile压缩数据成stata格式的shapefile2、Looking at data/观测数据2、Looking at data/观测数据grmap:Graph choropleth maps绘制等值区域图spdistance:Calculator for distance between places计算区域之间距离3...

weixin_39719989的博客 822

【YOLOv8实战】从零构建番茄成熟度智能检测GUI系统【附完整工程】

本文详细介绍了从零构建基于YOLOv8的番茄成熟度智能检测GUI系统的完整实战流程。内容涵盖环境搭建、数据集准备、模型训练调优,并重点讲解如何使用PyQt5开发图形界面,最终将项目打包为可执行文件,实现AI模型从训练到桌面应用落地的完整工程闭环。

xxx12的博客 821

单链表增序排列节点

我们既然想把节点排序 , 那就要先有一个初始节点, 然后把新节点来与初始节点比较, 如果比初始节点大,就插入到初始节点的后面,如果比初始节点小 , 那就插入到节点的前面 ,这样就把新元素插入到了, pre的后面, 但是后面的元素pre->next存储的是后面的元素,全被覆盖了, 相当于 比新元素大的元素,以后都断掉了,指针失踪了。我们如果直接覆盖掉 新节点的后继指针 p->next 的话 ,就会让下一个要操作的新节点q ,失去联系 ,那我们就失去了链表联系 ,那如何再接着构建链表呢?

qq_57484399的博客 2227

Conda环境创建报错?教你快速解决Solving environment: failed和ResolvePackageNotFound问题

本文深入解析Conda环境创建中常见的'Solving environment: failed'和'ResolvePackageNotFound'报错原因,并提供从基础到高级的系统化解决方案。涵盖渠道配置、版本通配、环境文件编辑等实用技巧,帮助开发者快速解决conda环境创建问题,提升工作效率。

weixin_28677451的博客 258

每日一道leetcode题 92.反转链表

1.思路 //思路:head表示需要反转的头节点,pre表示需要反转头节点的前驱节点 //我们需要反转n-m次,我们将head的next节点移动到需要反转链表部分的首部 //需要反转链表部分剩余节点依旧保持相对顺序即可 //比如1->2->3->4->5,m=1,n=5 //第一次反转:(pre)1(head) 2(next) 3 4 5 反转为 2 1 3 4 5 /...

Quentinmen的博客 237

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

R语言生存分析之限制性立方样条分析:样条回归、和多项式回归有什么不同?是否存在非线性关系、限制性立方样条cox回归模型

statistics+insight+vista+power 634

华为OD机考双机位C卷 - 采购订单 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 采购订单 。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 426

数据结构——链表

轻松无痛玩转链表

HZzzzzLu的博客 1万+

7、基于机器学习的生产效率估计方法解析

本文探讨了基于机器学习的生产效率估计方法,重点介绍了效率分析树(EAT)和凸效率分析树(CEAT)算法的原理及其与传统自由处置壳(FDH)和数据包络分析(DEA)方法的对比。通过剪枝优化、生产可能性集构建及方向距离函数(DDF)估计,EAT和CEAT在避免过拟合、提升估计稳定性与处理凸性假设方面展现出优势。结合PISA教育数据的实证研究,采用箱线图、核密度图和非参数检验方法验证了不同模型效率得分分布的显著差异。研究表明,EAT与CEAT为生产效率评估提供了更准确、灵活的工具,适用于教育、企业生产和医疗等多个

milk5的博客 92

链表数据结构

链表数据结构1 历史2 结构2.1 单向链表2.2 双向链表2.3 循环链表3链表的应用 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间...

Yuqbd的博客 990

使用 MATLAB/Simulink 构建一个基于FOC控制的PMSM矢量控制仿真模型

本教程详细介绍了基于MATLAB/Simulink的永磁同步电机(PMSM)磁场定向控制(FOC)系统建模与仿真方法。主要内容包括:PMSM电机模型参数设置、Clarke/Park变换模块设计、电流环PID控制器配置、SVPWM调制实现以及系统仿真参数优化。文章提供了模块化设计思路和具体参数设置示例,并给出了PID整定建议和进阶优化方向。通过该仿真模型,可深入理解PMSM矢量控制原理,掌握高性能电机控制系统的建模技巧,适用于伺服系统、电动汽车驱动等高端控制场景。教程还推荐了实时仿真和高级控制策略等扩展应用。

xiaoheshang_123的博客 528

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【数据结构】链表

数据结构中的链表(Linked List)是一种极其重要的、灵活的、动态的数据结构,它允许元素(通常被称为节点)以非连续的方式在内存中存储,并通过指针或引用相互连接。链表在数据结构领域扮演着至关重要的角色,特别是在需要频繁进行插入和删除操作的场景中。

大雨淅淅的博客 1088

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C语言数据结构-链表

图中指针变量plist保存的是第一个结点的地址,我们称plist此时“指向”第一个结点,如果我们希望plist“指向”第二个结点时,只需要修改plist保存的内容为0x0012FFA0.在前面说的单链表中的“头结点”,该头结点是链表的首节点(第一个结点),实际这样的称呼是错误的,因为链表中存在一种链表叫做带头链表(不是指链表里第一个有效的结点),这里的头结点指的是,在这里直接使用plist来遍历结果也是一样的,重新创建个pcur指针,是为了避免由于指针指向的改变,导致无法重新找到链表的首结点。

2302_81072215的博客 2261

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构-链表篇

数据结构-链表篇

qq_16268979的博客 1万+

数据结构【链表】

是⼀种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。结点的组成主要有两个部分:当前结点要保存的数据和保存下⼀个结点的地址(指针变量)。给定的链表的结构,实现链表从头到尾的打印。

2401_84320036的博客 1653

链表-Java实现链表数据结构

链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上 一个/或下一个节点的位置的链接(“links”) 链表(Linked list):是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数 据,而是在每一个节点里存到下一个节点的指针(Pointer)。 使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针 域,空间开销比较.

♾️ 2737
上一篇: 算法基本概念
下一篇: python用途与局限
one_zero_one
博客等级 码龄7年 30粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值