跳到主要内容

Linked Lists(链表)

考纲要求

  • 19.1.7 Linked list ADT:查找、插入、删除操作
  • 用数组实现链表,每个节点包含 data 和 nextNode

常见题型

题型分值示例
声明节点类型和数组2-4s21_qp_41 Q1a
初始化链表数据4s21_qp_41 Q1b
遍历输出链表6s21_qp_41 Q1c
插入节点到末尾7s21_qp_41 Q1d
查找节点4-5
删除节点6-8

核心代码模板

节点记录类型

class node:
def __init__(self):
self.data = 0
self.nextNode = 0

声明并初始化链表

linkedList = [node() for _ in range(10)]

# 手动初始化数据(根据题目表格)
linkedList[0].data = 1
linkedList[0].nextNode = 1
linkedList[1].data = 5
linkedList[1].nextNode = 4
# ...

startPointer = 0
emptyList = 5

遍历输出

def outputNodes(linkedList, startPointer):
current = startPointer
while current != -1:
print(linkedList[current].data)
current = linkedList[current].nextNode

插入到末尾

def addNode(linkedList, startPointer, emptyList):
data = int(input("Enter the data: "))
if emptyList == -1:
return False, startPointer, emptyList
newNode = emptyList
emptyList = linkedList[emptyList].nextNode
linkedList[newNode].data = data
linkedList[newNode].nextNode = -1
if startPointer == -1:
startPointer = newNode
else:
current = startPointer
while linkedList[current].nextNode != -1:
current = linkedList[current].nextNode
linkedList[current].nextNode = newNode
return True, startPointer, emptyList

查找节点

def findNode(linkedList, startPointer, target):
current = startPointer
while current != -1:
if linkedList[current].data == target:
return current
current = linkedList[current].nextNode
return -1

删除节点

def deleteNode(linkedList, startPointer, emptyList, target):
if startPointer == -1:
return False, startPointer, emptyList
if linkedList[startPointer].data == target:
temp = startPointer
startPointer = linkedList[startPointer].nextNode
linkedList[temp].nextNode = emptyList
emptyList = temp
return True, startPointer, emptyList
current = startPointer
while linkedList[current].nextNode != -1:
if linkedList[linkedList[current].nextNode].data == target:
temp = linkedList[current].nextNode
linkedList[current].nextNode = linkedList[temp].nextNode
linkedList[temp].nextNode = emptyList
emptyList = temp
return True, startPointer, emptyList
current = linkedList[current].nextNode
return False, startPointer, emptyList

常见错误

  • 忘记更新 emptyList 指针
  • 遍历时忘记更新 current 导致死循环
  • 删除时没有把被删节点归还空闲链表
  • 插入时没有检查空闲链表是否为空
  • 没有处理空链表(startPointer == -1)的特殊情况