Linked List链表使用Array和Class的实现方式

 这个问题的想法来源于一道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)

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值