我们还记得存储结构里不仅需要存储元素,还需要存储元素与元素的关系。顺序表靠着其天然的物理结构自然表达出这种关系,不需要附加额外的信息去表示这种关系,简直赚透了。而像链式存储这样非顺序存储的结构,需要额外附加指针去表示这种关系。
1.单链表的定义:处存放元素本身信息外,还需要存放一个指向后继的指针。
头指针:
头指针来标识一个单链表,其为NULL时表示一个空表。为了操作上的方便,可以在单链表第一个节点前附加一个节点,称为头节点,并把第一个节点的位置信息存放在头节点里。除此之外,头节点可以不设置任何信息,也可以去记录表长信息。
添加头节点的优点:
由于第一个数据节点的位置被存放在头节点的指针域,所以在链表上的第一个位置上的操作和其他位置上的操作一致,无需进行特殊处理。(比如添加操作时,无需对第一个节点进行特殊处理。)
无论链表是否为空,其头指针都指向头节点的非空指针。因此空表和非空表的处理也就得到了统一。
单链表具体方法的实现:
1.利用头插法建立链表
注意带头节点与不带头节点的区别。
2.利用尾插法建立链表
因为附设了一个指向尾节点的指针,故时间复杂度与头插法相同。(空间换时间)
3.按照序号查找节点值
4.按值查找表节点
5.插入节点操作
找到插入位置的前一个节点,然后再插入新节点。
如果在某节点前插入新节点,有两个思路(可供学习):
1.从头开始进行遍历,从而找到插入位置前面的节点。比较笨
2.在该节点后插入新节点,再交换两个节点的数据域的位置。(逻辑上满足要求)
6.删除节点操作:
先找到待删除节点的前驱,然后维护指针。和插入操作相同,主要的开销耗费在查找操作上,==也可以通过删除目的节点的后继节点来实现,将后继节点的数据域赋予其自身。
双链表的提出:
单链表访问后继节点的时间复杂度为o(1),而访问前驱节点的时间复杂度为o(n),所以通过增加前驱指针,用空间换取时间。
插入和删除操作注意维护相应的指针。
循环单链表和循环双链表:
增加了循环特性
判空条件不再是头节点的指针是否为空,而是它本身是否等于头指针。
静态链表:
静态链表是借助数组来描述线性表的链式存储结构,节点有数据域和指针域。和顺序表一样,静态链表也需要预先分配一块连续的内存空间。
静态链表以next==-1作为其结束的标志。其的插入、删除操作只需改变指针。对于不支持指针的高级语言(basic),这是一种非常巧妙的方法。
顺序表和链表的比较:
1.存取读写方式
2.逻辑结构和物理结构
3.查找、插入和删除操作。
对于顺序表来说,插入和删除,需要移动大量的元素;而对链表来说,虽然也要找插入位置,但相比之下,还是优于前者。
4.空间分配
链式存储的空间分配更加灵活高效。
5.难以估计线性表的长度时,不宜采用顺序表。
本文详细介绍了线性表的链式存储结构,包括单链表的定义、头节点的作用以及单链表的各种操作实现。此外,还讨论了双链表的优势,循环链表的特性和静态链表的概念,对比了链表与顺序表在存储和操作上的优缺点。
4252

被折叠的 条评论
为什么被折叠?



