#设计链表的实现。链表中的节点应该具有两个属性:val
和 next
class Node:
def __init__(self, val):
self.val = val
self.next = None
class MyLinkedList:
def __init__(self):
self.head = Node(0)
self.length = 0
def get(self, index: int) -> int:
#获取链表第index个元素的val,index无效则返回-1
if index < 0 or index >= self.length: #注意最后一个节点没有val
return -1
curr = self.head
# index steps needed
# to move from sentinel node to wanted index
for _ in range(index + 1):
curr = curr.next
return curr.val
def addAtHead(self, val: int) -> None:
#在第一个元素之前添加一个值为val的节点,新节点为head节点
self.addAtIndex(0, val)
def addAtTail(self, val: int) -> None:
#将值为val的节点追加为最后一个元素
self.addAtIndex(self.length, val)
def addAtIndex(self, index: int, val: int) -> None:
#在链表中的第 index 个节点之前添加值为 val 的节点。
#如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点
if index < 0:
index = 0
elif index > self.length:
return
add_node = Node(val)
pre = self.head
for i in range(index):
pre = pre.next
add_node.next = pre.next
pre.next = add_node
self.length += 1
def deleteAtIndex(self, index: int) -> None:
#如果索引 index 有效,则删除链表中的第 index 个节点
if index < 0 or index >= self.length: # 最后一个节点是null,没有val
return
self.length -= 1
# find predecessor of the node to be deleted
pred = self.head
for _ in range(index):
pred = pred.next
# delete pred.next
pred.next = pred.next.next
# Your MyLinkedList object will be instantiated and called as such:
# obj = MyLinkedList()
# param_1 = obj.get(index)
# obj.addAtHead(val)
# obj.addAtTail(val)
# obj.addAtIndex(index,val)
# obj.deleteAtIndex(index)