力扣 刪除鍊錶的倒數第N個節點

2021-09-27 09:39:06 字數 1152 閱讀 2647

題目要求:

給定乙個鍊錶,刪除鍊錶的倒數第 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 要刪...