题意
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性: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 或者合适的错误提示
原代码
此处将count-1放在了获取目标节点的上方,就会导致在获取目标节点遍历过程中出错,导致最后结果出错
因此必须要在找到节点以后再对count进行操作特地在这里记录一下。
但是在leetcode中总是出现这样一个问题,尚未解决不知是否是编译器问题