链表

本文深入探讨了链表这一数据结构,包括其使用原因、定义、单向链表、双向链表及循环链表的操作方法,如添加、删除节点等,旨在帮助读者理解链表的工作原理及其在解决特定问题时的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表(链式存储的线性表)

1.为啥使用链表
1.顺序表空间浪费,扩容后有不用的空间浪费了
2.内存往往没有能力提供较大的连续空间
2.定义:
1.数据存储在节点中
节点。某个属性=数据
2.节点存储下一个节点的位置信息(引用)
用户x 存y的引用 =>x=y
节点。某个属性=下一个节点
表示链表时,用第0个节点即可

3.单向链表

1.特点:
节点包含两个域:元素域,下一个节点链接域
2.单链表头部添加 O(1)
防止破坏原有链表,先操作新节点,在操作原有节点
1.新节点的next指向原首节点
2.head 指向新节点
3.单链表尾部添加 O(n)
1.若链表为空 则直接头部添加
否则:
1.遍历查询尾节点cur
2.cur的next 指向新节点
4.单链表任意位置添加
若待插入位置小于等于0则头部添加
若带插入位置大于等于长度,则尾部添加

否则:
1.遍历查找待查的前一个节点 cur
2.新节点的next 指向cur 的下一个节点
3.cur的next 指向新节点
5.单链表删除
1.查找待删节点cur 并记录前一个节点pre
2.若前一个节点存在,则pre 的next 指向cur 的nextO(n)
否则 head 指向cur 的next O(1)

4. 双向链表

1.特点:
节点包含三个域:一个元素域,两个链接域(前继和后继)
第0个节点没有前躯,最后一个没有后继
在单链表的基础上,增加向前指向的考虑
2.头部添加O(1
1.新节点的next 指向原首节点
2.原首节点存在的话,指向新节点
3.head 指向新节点
3.尾部添加O(n)
若链表为空,则直接头部添加
否则:
1.遍历查询尾节点
2.将尾节点的next 指向新节点
3.将新节点指向原尾节点
4.任意位置添加
如果待添加位置小于等于0,则在头部添加
如果待添加大于等于长度,则在尾部添加
否则:
1.遍历查询待插入位置的前一个节点cur
2.将新节点的next 指向cur 的next
3.将cur 的next 指向新节点
4.将新节点指向cur
5.将cur 的next 指向新节点
5.删除节点
1.查找待删节点cur
2**.若cur 有前驱结点**,将cur 的前驱节点指向cur 的next O(n)。
否则head 指向cur的后继节点O(1)
3 . 若cur 有后继节点,将cur 的前驱节点指向cur的后继节点

5.单向循环链表

1.特点:
节点包含两个域:元素域和链接域(下一个节点)
尾节点的next 指向第0个节点
当链表只有一个节点时,自己的next 指向自己
基于单链表的基础上,增加考虑首节点和尾节点的情况
2.循环链表遍历:
1.遍历结束条件:next == head
2.若链表为空,则不能遍历
3.循环退出时,尾节点还未访问

def travel(self):
if self.is_empty():
  return
 cur = self.head
 while = cur.next != cur.head
   print(cur.item end = ">")
   cur = cur.next
   至此,cur 指向尾节点,cur 本身还未打印
   print(cur.item)
   

3.循环链表头部添加
若找不到尾节点(链表为空):head 指向新节点,新节点next指向自己
否则:
1.遍历查找尾节点
2. 新节点的next指向原首节点
3.head 指向新节点
4.尾节点next指向新节点
4.循环链表尾部添加
若链表为空,则直接头部添加
否则:
1.遍历查询尾节点
2.将尾节点的next 指向新节点
3.将新节点指向首节点
5.循环链表任意位置添加
若待插入位置小于等于0则头部添加
若带插入位置大于等于长度,则尾部添加
否则:
1.遍历查找待查的前一个节点 cur
2.新节点的next 指向cur 的下一个节点
3.cur的next 指向新节点
6.循环链表删除
若链表为空,则直接返回

1.查找待删节点cur 并记录前一个节点pre
2.若前一个节点存在 则pre 的next 指向cur 的next O(n)
否则 1.遍历查找尾节点
2. head 指向cur 的next
3. 尾节点指向首节点
3.判断尾节点是否是待删节点
若有前一个节点,则pre 的next 指向cur 的next
否则(待删节点是唯一节点) head 指向None O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值