9.1 双链表
双链表(doubly link list):与之前的单链表不同的是,每一个结点有两个指针,一个指向下一个结点,另外一个指向上一个结点。
双链表中有两个指针,分别为头指针和尾指针,分别指向第一个结点和最后一个结点。
双链表的操作
遍历
双链表可以允许向前遍历,也可以向后遍历。
# 遍历,可从前往后遍历,也可从后往前遍历,时间复杂度是O(n)
def Traversal(head):
curNode = head
while curNode is not None:
print curNode.data
curNode = curNode.next
def revTraversal(tail):
curNode = tail
while curNode is not None:
print curNode.data
curNode = curNode.prev
搜索
假定链表有序,可以选择任意一个结点作为起点,如果目标值小于起始结点值,则向前遍历搜索,如果目标值大于起始结点值,则向后遍历搜索。
# 搜索,假设链表有序,可任意选择一个结点作为起始点,根据大小,选择遍历方向
def search(head, tail, probe = None):
if head is None:
return False
elif probe is None:
probe = head
if target < probe.data: # 目标比probe小,向前遍历
while probe is not None and target <= probe.data:
if target == probe.data:
return True
else:
probe = probe.prev
else: # 目标比probe大,向后遍历
while probe is not None and target >= probe.data:
if target == probe.data:
return True
else:
probe = probe.next
return False
插入
向有序双链表中插入元素,与单链表情况类似,只是要处理prev指针的指向。分三种情况,在第一个结点前插入,在最后一个结点后插入以及在中间插入。
# 插入元素
def insert(head, tail, value):
newnode = DListNode(value)
if head is None: # 双链表为空
head = newnode
tail = head
elif value < head.data: # 在head前插入元素
newnode.next = head
head.prev = newnode
head = newnode
elif value > tail.data: # 在tail后插入元素
newnode.prev = tail
tail.next = newnode
tail = newnode
else: # 在中间插入
node = head
while node is not None and node.data < value:
node = node.next
newnode.next = node
newnode.prev = node.prev
node.prev.next = newnode
node.prev = newnode
删除
删除元素也与单链表情形类似,也是要注意处理prev指针的指向。