自己寫的:
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def removeElements(self, head: Optional[ListNode], val): # 初始化一個元組 res,包含一個布林值和連結串列頭部的引用 res = (True, head) # 迴圈呼叫 remove_val 方法,直到 remove_val 返回 False,表示沒有找到要移除的值 while res[0]: res = self.remove_val(res[1], val) # 返回最終處理後的連結串列頭部 return res[1] def remove_val(self, head, val): # 初始化當前節點為連結串列頭部 cur = head # 初始化前一個節點為 None pre = None # 遍歷連結串列 while cur != None: # 如果當前節點的值等於要移除的值 if cur.val == val: # 如果前一個節點為 None,說明要移除的值在連結串列頭部 # 將連結串列頭部更新為當前節點的下一個節點 if pre == None: head = cur.next else: # 如果前一個節點不為 None,將前一個節點的 next 指向當前節點的下一個節點 pre.next = cur.next # 將當前節點的 next 設為 None,斷開當前節點的連線 cur.next = None # 返回 True 表示已經找到並移除了值 return True, head else: # 如果當前節點的值不等於要移除的值,更新前一個節點和當前節點的引用 pre = cur cur = cur.next # 如果遍歷完連結串列仍未找到要移除的值,返回 False return False, head
gpt改進:在頭節點前面新增一個虛擬節點 可以省掉很多麻煩
class Solution: def removeElements(self, head: Optional[ListNode], val): # 建立一個虛擬頭節點,簡化對頭部的處理 dummy = ListNode(0) dummy.next = head # 初始化當前節點為虛擬頭節點 cur = dummy # 遍歷連結串列 while cur.next: # 如果當前節點的下一個節點的值等於要移除的值 if cur.next.val == val: # 刪除當前節點的下一個節點 cur.next = cur.next.next else: # 如果當前節點的下一個節點的值不等於要移除的值,繼續向後移動 cur = cur.next # 返回虛擬頭節點的下一個節點作為新的頭部 return dummy.next