leedcode-移除連結串列元素

Junior_bond發表於2024-03-08

自己寫的:

# 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

相關文章