链表结构(linked structure)是程序中最常用的数据结构。其由两种结构:单向链表和双向链表
单向链表:由头和节点组成,链表只能向前移动
双向链表:由头、尾和节点构成,链表双向移动
链表无法指定索引,因此必须从结构的一端开始。单链表访问时必须由头开始,逐次获取后继项。双链表允许从头或者尾开始。
最后一项是空链接,其缺少下一个连接
1.单向链表的定义及其遍历
#定义Node类为节点,data是存储的值,next是下一个节点,尾节点必须是None
class Node(object):
def __init__(self, data, next=None):
self.data = data
self.next = next
#链表可以由for循环产生
if __name__ == "__main__":
head = None
for count in range(6):
head = Node(count, head)
#链表可以通过循环遍历,直到下一个节点为空节点时结束遍历
while head != None:
print(head.data)
head = head.next
链表的遍历在时间上是线性的。
2.链表的搜索
def find_val(node, val):
while node != None and node.data != val:
node = node.next
return node
注意防止链表中并没有与目标值匹配的节点值时,遇见尾部(None)也需要结束
3.链表的替换
def replace(node, OldVal, NewVal):
while node != None and node.data != OldVal:
node = node.next
if node!=None:
node.data = NewVal
4.末尾处插入
def insert_InTail(node, val):
new_node = Node(val, None)
if node is None:
Node = new_node
while node.next != None:
node = node.next
node.next = new_node
找到尾部,创建一个新的节点,加入尾部。
注意,当链表是一个空链表的时候,初始节点为空,直接替换成新的节点。
5.开始处插入
def insert_InHead(node, val):
node = Node(val, node)
return node
这个是链表结构优于线性操作的操作。
6.开始处删除
def delete_InHead(node):
if node is None:
return None, None
data = node.data
node = node.next
return node, data
7.尾部处删除
def delete_InTail(node):
x = node
if x is None:
return None, None
if x.next is None:
data = x.data
return None, data
while x.next.next != None:
x = x.next
data = x.next.data
x.next = None
return node, data
8.任意位置插入
def insert(node, index, val):
if node is None or index <=0:
node = Node(val, node)
return node
else:
prob = node
while index > 1 and prob.next != None:
prob = prob.next
index -= 1
prob.next = Node(val, prob.next)
return node
9.任意位置删除
def delete(node, index):
if index <= 0 or node.next is None:
remove = node.data
node = node.next
return node, remove
else:
prob = node
while index > 1 and prob.next.next != None:
prob = prob.next
index -= 1
remove = prob.next.data
prob.next= prob.next.next
return node, remove