題目描述:
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:
給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:給定的 n 保證是有效的。
高階:
你能嘗試使用一趟掃瞄實現嗎?
方法一:兩次遍歷演算法
思路
我們注意到這個問題可以容易地簡化成另乙個問題:刪除從列表開頭數起的第 (l - n + 1)個結點,其中 l 是列表的長度。只要我們找到列表的長度 l,這個問題就很容易解決。
演算法首先我們將新增乙個啞結點作為輔助,該結點位於列表頭部。啞結點用來簡化某些極端情況,例如列表中只含有乙個結點,或需要刪除列表的頭部。在第一次遍歷中,我們找出列表的長度 l。然後設定乙個指向啞結點的指標,並移動它遍歷列表,直至它到達第 (l - n) 個結點那裡。我們把第 (l - n)個結點的 next 指標重新鏈結至第(l−n+2) 個結點,完成這個演算法。
}}方法二:一次遍歷演算法
演算法上述演算法可以優化為只使用一次遍歷。我們可以使用兩個指標而不是乙個指標。第乙個指標從列表的開頭向前移動 n+1 步,而第二個指標將從列表的開頭出發。現在,這兩個指標被 n個結點分開。我們通過同時移動兩個指標向前來保持這個恆定的間隔,直到第乙個指標到達最後乙個結點。此時第二個指標將指向從最後乙個結點數起的第 n 個結點。我們重新鏈結第二個指標所引用的結點的 next 指標指向該結點的下下個結點。
LeetCode 19 鍊錶(160)
1 如圖,鍊錶是一種非常常用的資料結構 煉表頭 指向第乙個鍊錶結點的指標 鍊錶結點 鍊錶中的每乙個元素,包括 1 當前結點的資料,2 下乙個結點的位址 鍊錶尾 不再指向其他結點的結點,其位址部分放乙個null,表示鍊錶到此結束。2 鍊錶可以動態地建立 動態地申請記憶體空間 int pint new ...
鍊錶 LeetCode19刪除鍊錶中的第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?分析 看到這個問題,第一反應,先求長度,再找節點,看一下高階,有...
Leetcode 19 刪除鍊錶的第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?兩次遍歷的演算法思路 第一遍歷從頭結點開始來計算鍊錶的長度,然後...