2024/11/25 LeetCode707.设计链表
解法一:单链表解法
1 #单链表法 2 class ListNode: 3 def __init__(self, val=0, next=None): 4 self.val = val 5 self.next = next 6 7 class MyLinkedList: 8 9 def __init__(self): 10 '''初始化 MyLinkedList 对象''' 11 self.dummy_head = ListNode() 12 self.size = 0 13 14 def get(self, index: int) -> int: 15 '''获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。''' 16 if index < 0 or index >= self.size: 17 return -1 18 19 current = self.dummy_head.next 20 for i in range(index): 21 current = current.next 22 23 return current.val 24 25 def addAtHead(self, val: int) -> None: 26 '''将一个值为 val 的节点插入到链表中第一个元素之前。''' 27 self.dummy_head.next = ListNode(val, self.dummy_head.next) 28 self.size += 1 29 return 30 31 def addAtTail(self, val: int) -> None: 32 '''将一个值为 val 的节点追加到链表中作为链表的最后一个元素。''' 33 current = self.dummy_head 34 while current.next: 35 current = current.next 36 current.next = ListNode(val) 37 self.size += 1 38 return 39 40 def addAtIndex(self, index: int, val: int) -> None: 41 '''将一个值为 val 的节点插入到链表中下标为 index 的节点之前。 42 如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。 43 如果 index 比长度更大,该节点将 不会插入 到链表中。''' 44 if index < 0 or index > self.size: 45 return 46 47 current = self.dummy_head 48 for i in range(index): 49 current = current.next 50 current.next = ListNode(val, current.next) 51 self.size += 1 52 return 53 54 def deleteAtIndex(self, index: int) -> None: 55 '''如果下标有效,则删除链表中下标为 index 的节点''' 56 if index < 0 or index >= self.size: 57 return 58 59 current = self.dummy_head 60 for i in range(index): 61 current = current.next 62 current.next = current.next.next 63 self.size -= 1 64 return
解法二:双链表解法
代码随想录给的解法,比较复杂。如下的解法在解法一上更改,更简便。
#双链表法 class ListNode: def __init__(self, val=0, pre=None, next=None): self.val = val self.pre = pre self.next = next class MyLinkedList: def __init__(self): '''初始化 MyLinkedList 对象''' self.dummy_head = ListNode() self.size = 0 def get(self, index: int) -> int: '''获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。''' if index < 0 or index >= self.size: return -1 current = self.dummy_head.next for i in range(index): current = current.next return current.val def addAtHead(self, val: int) -> None: '''将一个值为 val 的节点插入到链表中第一个元素之前。''' AddNode = ListNode(val, self.dummy_head, self.dummy_head.next) if self.dummy_head.next: self.dummy_head.next.pre = AddNode self.dummy_head.next = AddNode self.size += 1 return def addAtTail(self, val: int) -> None: '''将一个值为 val 的节点追加到链表中作为链表的最后一个元素。''' current = self.dummy_head while current.next: current = current.next AddNode = ListNode(val, current) current.next = AddNode self.size += 1 return def addAtIndex(self, index: int, val: int) -> None: '''将一个值为 val 的节点插入到链表中下标为 index 的节点之前。 如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。 如果 index 比长度更大,该节点将 不会插入 到链表中。''' if index < 0 or index > self.size: return current = self.dummy_head for i in range(index): current = current.next AddNode = ListNode(val, current, current.next) if current.next: current.next.pre = AddNode current.next = AddNode self.size += 1 return def deleteAtIndex(self, index: int) -> None: '''如果下标有效,则删除链表中下标为 index 的节点''' if index < 0 or index >= self.size: return current = self.dummy_head for i in range(index): current = current.next if current.next.next: current.next.next.pre = current current.next = current.next.next self.size -= 1 return