给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
方法一:不使用虚拟头节点
如果删除的时头节点,则需要单独处理,即直接将头节点指向下一个节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
class Solution: def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]: new_head = head cur = head pre = None while cur != None: if cur.val == val: if pre == None: cur = cur.next new_head = cur else: pre.next = cur.next cur = cur.next else: pre = cur cur = cur.next return new_head
方法二:使用虚拟头节点
设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。
1 2 3 4 5 6 7 8 9 10 11 12 13
class Solution: def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]: dummy_head = ListNode(0, head) cur = head pre = dummy_head while cur != None: if cur.val == val: pre.next = cur.next else: pre = pre.next cur = cur.next return dummy_head.next
def addAtTail(self, val: int) -> None: cur = self.dummy_head.next pre = self.dummy_head
new_node = ListNode(val, None)
while cur != None: cur = cur.next pre = pre.next pre.next = new_node
def addAtIndex(self, index: int, val: int) -> None: i = 0 cur = self.dummy_head.next pre = self.dummy_head
while cur != None: if index == i: new_node = ListNode(val, cur) pre.next = new_node # 这里要写 return,不能写 break return else: i += 1 pre = pre.next cur = cur.next # print(i, cur.val) if index == i: new_node = ListNode(val, None) pre.next = new_node def deleteAtIndex(self, index: int) -> None: i = 0 cur = self.dummy_head.next pre = self.dummy_head
while cur != None: if index == i: pre.next = cur.next break else: i += 1 pre = pre.next cur = cur.next