LeetCode设计链表Python实现过程中遇到的问题

75 阅读3分钟

题意

你可以选择使用单链表或者双链表,设计并实现自己的链表。

单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。

如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

实现 MyLinkedList 类:

  • MyLinkedList() 初始化 MyLinkedList 对象。
  • int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
  • void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
  • void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
  • void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
  • void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。

直接贴上代码这里就只贴双链表的实现的代码吧

class node():
    def __init__(self,val):
        self.val = val
        self.next = None
        self.prev = None

class MyLinkedList():
    def __init__(self):
        self._head,self._tail=node(0),node(0)
        self._head.next,self._tail.prev=self._tail,self._head
        self._count=0
    def _get_node(self,index:int):
        if index>=self._count//2:
            p=self._tail
            for _ in range(self._count-index):
                p=p.prev
            return p
        else:
            p=self._head
            for _ in range(index+1):
                p=p.next
            return p
    def _update(self,prev:node,next:node,val:int):
        self._count+=1
        p=node(val)
        prev.next,next.prev = p,p
        p.prev,p.next=prev,next

    def get(self,index:int):
        if 0<=index<=self._count:
            p=self._get_node(index)
            return p.val
        else:
            return None
    def addAtIndex(self,index:int,val:int):
        if index<=0:
            index=0
        elif index>self._count:
            return
        node=self._get_node(index)
        self._update(node.prev,node,val)
    def deleteAtIndex(self,index:int):
        if  0<=index<self._count:
            p=self._get_node(index)
            self._count -= 1
            #应当先取出需要删除的节点再进行count-1
            p.prev.next,p.next.prev=p.next,p.prev
   

测试用例

if __name__=='__main__':
    # 创建一个空的链表
    linked_list = MyLinkedList()

    # 添加元素到链表头
    print("Test 1: Add elements at the head")
    linked_list.addAtIndex(0, 10)  # 添加到头部,链表: [10]
    print(linked_list.get(0))  # 期望输出 10

    # 添加元素到链表尾
    linked_list.addAtIndex(1, 20)  # 添加到尾部,链表: [10, 20]
    print(linked_list.get(1))  # 期望输出 20

    # 在链表的指定位置添加元素
    print("Test 2: Add elements at a specified index")
    linked_list.addAtIndex(1, 15)  # 在索引1位置添加15,链表: [10, 15, 20]
    print(linked_list.get(1))  # 期望输出 15
    print(linked_list.get(2))  # 期望输出 20

    # 删除指定索引的元素
    print("Test 3: Delete element at index")
    linked_list.deleteAtIndex(1)  # 删除索引1的元素,链表: [10, 20]
    print(linked_list.get(1))  # 期望输出 20

    # 在索引0位置插入元素
    linked_list.addAtIndex(0, 5)  # 添加到头部,链表: [5, 10, 20]
    print(linked_list.get(0))  # 期望输出 5

    # 删除头部元素
    linked_list.deleteAtIndex(0)  # 删除头部,链表: [10, 20]
    print(linked_list.get(0))  # 期望输出 10

    # 超出范围的删除操作
    print("Test 4: Invalid delete operation")
    linked_list.deleteAtIndex(10)  # 无效删除,链表不变
    print(linked_list.get(0))  # 期望输出 10

    # 访问不存在的索引
    print("Test 5: Accessing out of bounds")
    print(linked_list.get(5))  # 期望输出 None 或者合适的错误提示

image.png 原代码

image.png

此处将count-1放在了获取目标节点的上方,就会导致在获取目标节点遍历过程中出错,导致最后结果出错

image.png

因此必须要在找到节点以后再对count进行操作特地在这里记录一下。

但是在leetcode中总是出现这样一个问题,尚未解决不知是否是编译器问题

image.png

image.png