題目要求:
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:給定的 n 保證是有效的。
高階:你能嘗試使用一趟掃瞄實現嗎?
解題思路:
方法一:兩次遍歷演算法:
首先分析問題,問題可以簡化為:刪除從列表開頭數起的第(l-n+1)個節點,其中l是列表長。那麼只要知道列表的長度就可以解決問題。
演算法:
引入啞節點作為輔助。啞節點位於列表頭部,引入啞節點的好處:啞節點用來簡化某些極端情況,例如列表中只含乙個節點,或需要刪除列表的頭部。
在第一次遍歷中找到l的長度。然後將指標與啞節點指向同一位置,進行二次遍歷。第二次遍歷,直到它到達第(l-n)個節點**。(l-n)位置的下乙個元素就是要刪除元素的元素,然後將第(l-n)個節點的next重新連線到下下個節點就可以了。
方法二:一次遍歷演算法
演算法:
利用雙指標思路。原理:讓前後兩個指標先後移動,間隔相差n,當先移動的那個指標指向最後乙個元素即最後那個空指標時,後移動的那個指標正好指向要刪除的元素的前乙個。然後將它的下下個節點賦值給下個節點就可以了。
解題過程:
方法一:
func removenthfromend(head *listnode, n int) *listnode
length-=n
first=dummy
for length>0
first.next=first.next.next
return dummy.next
}
方法二:
func removenthfromend(head *listnode, n int) *listnode
for first!=nil
second.next=second.next.next
return dummy.next
}
結果: 力扣 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?思路 定義乙個虛擬頭節點x,為能刪除頭節點。定義快慢指標,快慢指...
力扣19 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。definition for singly linked list.struct listnode...
力扣日記 019 刪除鍊錶的倒數第n個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?1 獲得表頭,通過迴圈遍歷鍊錶,建立乙個容器將節點儲存。2 要刪...