6.4.1 带尾指针的链表
在单链表的末尾,加上一个指针用于指向链表的最后一个结点。
追插元素(append)
在链表的最后一个结点,增加新的结点,如果使用尾指针的话,较为便利。只需将尾指针指向新结点,并将原来最后一个结点指向新结点即可。
def append(head, tail, item):
newNode = ListNode(item)
if head is None:
head = newNode # 头指针指向新节点
else:
tail.next = newNode
tail = newNode # 尾指针指向新节点
删除元素
删除元素相比之前,就需要多考虑一种情况,那就是要删除的元素是最后一个结点时,就需要额外将尾指针指向原来最后一个结点的上一个结点。
def remove(head, tail, target):
predNode = None
curNode = head
while curNode is not None and curNode.data != target:
predNode = curNode
curNode = curNode.next
if curNode is not None:
if curNode is head:
head = curNode.next
else:
predNode.next = curNode.next
if curNode is tail: # 必须要考虑删除的节点有可能就是尾指针指向的节点
tail = predNode
链表可以按照结点的数值大小排列起来。
线性搜索
线性搜索可以利用排序的优势,进行线性搜索,遇到比目标数值大的结点时,会提前退出循环。
def sortedSearch(head, target):
curNode = head
while curNode is not None and curNode.data < target: # 遇到节点的数值比目标还要大,则直接退出循环
if curNode.data == target:
return True
else:
curNode = curNode.next
return False
插入结点
同样利用线性搜索先找到插入位置,再插入结点。
# 插入结点
def insert(head, value):
predNode = None
curNode = head
while curNode is not None and curNode.data < value:
predNode = curNode
curNode = curNode.next
# 此时curNode指向的正是新值要插入的位置
newNode = ListNode(value)
newNode.next = curNode
if curNode is head:
head = newNode
else:
predNode.next = newNode