链表(2)之双向链表
1.双向链表的实现
双链表的基本结构
带头(哨兵位)➕双向➕循环链表的增删查改
(1)结构体的定义
(2)创建一个新节点
(3)双向链表的初始化
(4)打印双向链表
(5)双向链表的尾插
(6) 因为链表为空,就没必要删除了,所以增加一个判断是否为空的函数
判断是否为空(用bool值)
(7)双向链表的尾删
(8)双向链表的头插
(9)双向链表的头删
(10)查找双向链表中某个值的位置pos
(11)在pos位置之前插入一个节点
(12)双向链表删除pos位置的节点
(13)双向链表的销毁
(14)测试以上函数
2.链表oj题目:
题目一:复杂链表的复制
给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点。要求返回这个链表的深度拷贝
给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。例如,如果原链表中有X和Y两个节点,其中X.random-- > Y ,那么在复制链表中对应的两个节点x和y,同样有x.random-- > y
思路1:首先将这个链表拷贝下来,先拷贝每个元素和next,然后对于random的指向,就在原链表中找到这个
元素中random指向的那个元素的相对位置,在它前面的就是负数,在后面的就是正数
该方法的时间复杂度是O(N²)
思路2:1.将拷贝节点链接在原节点的后面 2.拷贝每个原节点的random,然后拷贝节点的random就是原节点random
指向的next 3.拷贝节点剪下来,形成一个新的链表,并且恢复原链表
思路图:
oj代码
3.链表和顺序表的优势对比
4.存储器的存储体系