Linked List不用class,两个数组的实现方式

该方法出现在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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值