该方法出现在A Level Computer Science的教科书上,实现方式比较特殊,一般是用Class类实现,因此本文将详细讨论使用两个数组来实现链表的方法,供大家学习交流。
假设原始数据如下图所示
myLinkedList存储的是data
myLinedListPointers存储的是data对应的index,因为形成链表结构。
startPointer表示头结点的index
heapStartPointer表示“空链表”的头结点 (可以将空白数据看成是一个空链表)
初始化
myLinkedList = [27, 19, 36, 42, 16, None, None, None, None, None, None, None]
myLinkedListPointers = [-1, 0, 1, 2, 3, 6, 7, 8, 9, 10, 11, -1]
startPointer = 4
nullPointer = -1
heapStartPointer = 5
打印链表
为了方便每次调试查看链表结构,因此写了遍历链表的函数
def output_list():
global startPointer
index = startPointer
while myLinkedList[index]:
print(myLinkedList[index])
index = myLinkedListPointers[index]
查找元素
查找在遍历的逻辑上又添加了一些条件,因此放在一起讨论。这里返回值可以根据需要修改。
def find(itemSearch):
found = False
itemPointer = startPointer
while itemPointer != nullPointer and not found:
if myLinkedList[itemPointer] == itemSearch:
found = True
else:
itemPointer = myLinkedListPointers[itemPointer]
return found
添加元素
这里使用头插法,因为这里使用数组进行存储链表结构,所以链表的长度有限,需要用if判断,反馈消息。
def insert(itemAdd):
global startPointer,heapStartPointer
if heapStartPointer == nullPointer:
print("Linked List full")
else:
tempPointer = startPointer
startPointer = heapStartPointer
heapStartPointer = myLinkedListPointers[heapStartPointer]
myLinkedList[startPointer] = itemAdd
myLinkedListPointers[startPointer] = tempPointer
删除元素
删除是最复杂的情况。
首先需要判断是否是空链表,
其次需要找到删除的元素是否存在,
存在的情况下,删除头结点和中间结点的方法需要单独讨论,
若是删除头结点,则需要更新startPointer到下一个结点的位置,并且更新空链表中的heapStartPointer的位置,相当于是将删除的头结点用头插法插入空链表。
def delete(itemDelete):
global startPointer, heapStartPointer
oldindex = None
if startPointer == nullPointer:
print("Linked List empty")
else:
index = startPointer
while myLinkedList[index] != itemDelete and index != nullPointer:
oldindex = index
index = myLinkedListPointers[index]
if index == nullPointer:
print("Item ", itemDelete, " not found")
else:
if index!=startPointer: #如果删除的是中间结点(包括尾结点)
myLinkedList[index] = None
tempPointer = myLinkedListPointers[index]
myLinkedListPointers[index] = heapStartPointer
heapStartPointer = index
myLinkedListPointers[oldindex] = tempPointer
else: #如果删除的是头结点
myLinkedList[startPointer]=None
temp = myLinkedListPointers[startPointer]
myLinkedListPointers[startPointer]=heapStartPointer
heapStartPointer = startPointer
startPointer = temp
调用调试函数
print(find(36))
delete(int(input("Enter the number:")))
print(myLinkedList)
print(myLinkedListPointers)
print(heapStartPointer)
print(startPointer)
output_list()
insert(30)
print(myLinkedList)
print(myLinkedListPointers)
print(heapStartPointer)
output_list()