3. 链接表
3.1 线性表的基本需要与链接表
实现线性表的基本需要是:
- 能够找到首元素
- 从任一元素出发,能找到它之后的下一个元素
把表存储在连续的存储块中,即顺序表,能够满足这两个要求,元素的顺序关联是隐含的。然而,实现线性表还可以基于链式结构,该方式实现的顺序表称为链接表或者链表。实现的基本思想如下:
- 把表元素存放于独立的存储块里(表的节点)
- 从表的任一节点能够找到下一节点
- 在前一节点用链接的方式显式记录与下一节点之间的关联
3.2 单链表
单项链接表(单链表)的节点是一个二元组,元素域elem保存着表元素的数据项,链接域next保存着下一个节点的标识。要掌握一个表,只需要用一个变量保存着这个表的首节点的引用(标识或链接),该变量称为表头变量或表头指针。为了表示链表的结束,给最后节点的链接域设置一个空链接,如在python中用None。如果一个表头指针是一个空连接,则说明是空表。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uKaOyFBy-1576584599538)(03_3.jpg)]
定义一个表节点类如下:
class LNode:
def __init__(self, elem, next_ = None): #next_加下划线避免与python内置的next重名
self.elem = elem
self.next_ = next_
基本链表操作
- 创建空链表:表头变量设置为空链接,如None
- 删除链表:同上,python的存储管理系统会自动回收不用的存储
- 判断表是否为空:将表头变量的值与空链接比较
- 判断表是否满:一般链表不会满,除非所有存储空间都用完
加入元素
包括首段插入、尾端插入及定位插入。和顺序表相比,链表插入数据不需逐个移动元素,只需修改单个节点的链接,接入新节点。
表首端插入:插入新元素作为表的第一个元素
step1:创建新节点并存入数据
step2:将原链表首节点存入新节点的next
step3:修改表头变量,指向新节点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kPwGIGmm-1576584599540)(03_4.jpg)]
#示例代码
q = LNode(13)
q.next = head.next
head = q
'\n#示例代码\nq = LNode(13)\nq.next_ = head.next_\nhead = q\n'
一般情况的元素插入:先找到插入点之前的节点,然后修改插入节点和之前节点的next域
step1:创建新节点存入数据
step2:把pre的next域的值存入新节点的next域
step3:修改pre的next域,指向新节点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbaOORUB-1576584599540)(03_5.jpg)]
# 示例代码段
q = LNode(13)
q.next = pre.next
pre.next = q
删除元素
删除表首元素:删除第一个节点,只需将表头后移一个
#示例代码
head = head.next
一般情况的元素删除:找到所删元素节点的前一个节点pre,修改pre的next域,指向被删节点的下一节点。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UlmkQgYj-1576584599541)(03_6.jpg)]
#示例代码
pre.next = pre.next.next
扫描、定位、遍历
扫描:从表头变量开始,沿着表中链接逐步执行某些操作,称为链表的扫描。
具体方法是:借助辅助变量p(扫描指针)进行遍历,执行操作,直到p到达尾部,即p为None。
#示例代码
p = head
while p is not None and 需要继续的其他条件:
执行数据所需操作
p = p.next
按下标定位:链表首节点元素看作下标0,确定第i个元素所在节点的操作称为按