《我的第一本算法书》链表的Python实现
一、链表
1、链表的基本结构
链表的每个单元都包括了存储的数据和指向下一个单元的指针。
2、链表单元的代码结构
class Data(object):
def __init__(self, content):
self.next = None
self.content = content
二、链表的常用方法
1、顺序访问
链表为分散存储,想要访问数据,只能从第1个数据开始顺着指针指向进行。
(1)初始化单元数据
Blue = Data('Blue')
Yellow = Data('Yellow')
Red = Data('Red')
(2)建立单元间链接
Blue.next = Yellow
Yellow.next = Red
(3)建立访问方法
单向链表有尽头,不断向后访问直至指针指向空处(None)
def checkLinkList(head_data)
tmp = head_data
while tmp:
print(tmp.content, end='')
if tmp.next:
print(' → ', end='')
else:
print('')
tmp = tmp.next
执行checkLinkList(Blue)
结果:
Blue → Yellow → Red
2、添加数据
将插入数据位置的前一个单元的指针指向新数据,将新数据单元的指针指向下一个单元即可。
Green = Data('Green')
Green.next = Yellow
Blue.next = Green
在Blue后面插入一个Green的新数据,执行checkLinkList(Blue)
结果:
Blue → Green → Yellow → Red
3、删除数据
将目标单元的前一个单元的指针指向目标单元的下一个单元,即可完成删除。
Green.next = Red
将Green的指针指向Red以删除Yellow,执行checkLinkList(Blue)
结果:
Blue → Green → Red
三、拓展链表
1、循环链表(环形链表)
单链表末端重新指向首端形成环形的链表。
将Red的指针指向Blue,注意需要修改访问方法,判断回到首端则停止继续访问,否则将无限循环访问下去:
def checkLinkList(head_data):
tmp = head_data
while tmp:
print(tmp.content, end='')
if tmp.next:
print(' → ', end='')
else:
print('')
tmp = tmp.next
#增加代码
if tmp is head_data:
print(tmp.content, end='...')
break
Red.next = Blue
后调用checkLinkList(Blue)
输出结果:
Blue → Green → Red → Blue...
2、双向链表
每个数据单元都有两个指针,分别指向前一个单元和后一个单元