203. Remove Linked List Elements


Posted by david-christian on 2025-02-18

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeElements(head *ListNode, val int) *ListNode {
    dummy := &ListNode{}
    dummy.Next = head
    tail := dummy
    for tail.Next != nil {
        currenNode := tail.Next
        if currenNode.Val == val {
            tail.Next = currenNode.Next
        } else {
            tail = tail.Next
        }

    }
    return dummy.Next

}

使用虛擬頭節點來優化頭部點的判斷處理

以當前節點的下一節點的角度來操作

實作時犯了一個錯誤,原先是寫這樣

if currenNode.Val == val {
    tail.Next = currenNode.Next
} 
tail = tail.Next

這樣會有兩個問題

  1. 有進行刪除節點的下一圈,會漏掉判斷一個節點
  2. 如果刪除的節點是最後一個,tail 會指向 nil,再下一圈(最後一個判斷)時,會因 `tail.Next != nil` 引發訪問 nil 的 panic

結論

如果有刪除節點的情況下,因 tail 的下一節點已發生改變,tail 這個指針位置不移動,因為解決問題的思路一直是以當前節點的下一節點為角度










Related Posts

[CMD101] Command Line 超新手入門

[CMD101] Command Line 超新手入門

[BE101] 資訊安全

[BE101] 資訊安全

演習課 WEEK14 (部屬)

演習課 WEEK14 (部屬)


Comments