这个问题的想法来源于一道A level CS 21年43卷的真题,所以在这里给出解决方法供大家参考。
本题的链表存储方式是使用一维数组存储node结点,每个node结点定义为一个class类,包含data和nextNode(指向下一个node的位置)
Node定义
class Node:
def __init__(self,data,NextNode):
self.data = data
self.NextNode = NextNode
初始化一个新的LinkedList数组,长度为10
StartPointer = -1
freePointer = 0
LinkedList=[]
for i in range(10):
node1 = Node(None,None)
LinkedList.append(node1)
LinkedList[i].NextNode = i + 1
LinkedList[9].NextNode = -1
StartPointer指向第一个元素的位置,因还没有插入任何数据,因此StartPointer为-1
freePointer指向空链表中的第一个free node,下次插入node时,将会插入在freePointer的位置
初始化的最后一个结点的next node指向-1,表示尾结点
初始化题目中的链表结构
StartPointer = 0
freePointer = 5
LinkedList2 = [Node(1,1),Node(5,4),Node(6,7),Node(7,-1),Node(2,2),Node(0,6),Node(0,8),Node(56,3),Node(0,9),Node(0,-1)]
数组中存储的是10个Node对象
链表头指针是0,空链表的头结点是5
其结点连接顺序是1-->5--->2--->6--->56--->7
按链表结构 依次顺序输出结点的data
用于每次进行添加/删除操作时,测试代码功能
def DisyplayLinkedList(LinkedList):
global StartPointer
index = StartPointer
while index != -1:
print(LinkedList[index].data,end="--->")
index = LinkedList[index].NextNode
print("\n")
调用运行DisplayLinkedList()测试LinkedList2
DisyplayLinkedList(LinkedList2)
运行结果:
头插法插入Node
这里建议把链表结构画出来,以更好的理解。
(以后有时间再更新一下链表结构示意图,以帮助更好理解Add Node)
def AddNode(LinkedList,data):
global StartPointer,freePointer
if freePointer == -1:
print("The list is full")
else:
LinkedList[freePointer].data = data
nextFree = LinkedList[freePointer].NextNode
LinkedList[freePointer].NextNode = StartPointer
StartPointer = freePointer
freePointer = nextFree
调用AddNode()测试
DisyplayLinkedList(LinkedList2)
AddNode(LinkedList2,23)
DisyplayLinkedList(LinkedList2)
AddNode(LinkedList2,7)
DisyplayLinkedList(LinkedList2)
AddNode(LinkedList2,5)
DisyplayLinkedList(LinkedList2)
AddNode(LinkedList2,90)
DisyplayLinkedList(LinkedList2)
AddNode(LinkedList2,87)
DisyplayLinkedList(LinkedList2)
运行结果:
删除指定结点
def DeleteNode(data,LinkedList):
global StartPointer,freePointer
if StartPointer == -1:
print("Empty list")
else:
index = StartPointer
pre_index = index
while LinkedList[index].data != data and index != -1:
pre_index = index
index = LinkedList[index].NextNode
if index == -1:
print("The value is not found")
else:
if index != StartPointer:
LinkedList[index].data = None
LinkedList[pre_index].NextNode = LinkedList[index].NextNode
LinkedList[index].NextNode = freePointer
freePointer = index
else:
temp = StartPointer
StartPointer = LinkedList[StartPointer].NextNode
LinkedList[temp].NextNode = freePointer
freePointer = temp
在本题中的删除可以拆分为删除和添加进行理解。
首先判断是否是空链表,如果不是的情况下,从startPointer开始搜索data,直到找到或者到达链表的尾巴,每次搜索都需要记录下当前(index)和前一个的指针位置(pre_index)
删除搜索到的结点(前一个结点的nextNode指向当前结点的nextNode),并以头插法将当前结点插入到空链表中。
调用DeleteNode()调试:
DeleteNode(2,LinkedList2)
DisyplayLinkedList(LinkedList2)
DeleteNode(1,LinkedList2)
DisyplayLinkedList(LinkedList2)
运行结果: