給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:
給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
高階:
你能嘗試使用一趟掃瞄實現嗎?
方法一:兩次遍歷演算法思路我們注意到這個問題可以容易地簡化成另乙個問題:刪除從列表開頭數起的第(l−
n+1)
(l - n + 1)
(l−n+1
)個結點,其中 l 是列表的長度。只要我們找到列表的長度 l,這個問題就很容易解決。
演算法
首先我們將新增乙個啞結點作為輔助,該結點位於列表頭部。啞結點用來簡化某些極端情況,例如列表中只含有乙個結點,或需要刪除列表的頭部。在第一次遍歷中,我們找出列表的長度l
ll。然後設定乙個指向啞結點的指標,並移動它遍歷列表,直至它到達第 (l−
n)(l - n)
(l−n
)個結點那裡。我們把第(l−
n)(l - n)
(l−n
)個結點的 next 指標重新鏈結至第(l−
n+2)
(l−n+2)
(l−n+2
)個結點,完成這個演算法。
public listnode removenthfromend
(listnode head,
int n)
length -= n;
first = dummy;
while
(length >0)
first.next = first.next.next;
return dummy.next;
}
複雜度分析方法二:一次遍歷演算法演算法上述演算法可以優化為只使用一次遍歷。我們可以使用兩個指標而不是乙個指標。第乙個指標從列表的開頭向前移動n+1
n+1n+
1步,而第二個指標將從列表的開頭出發。現在,這兩個指標被n
nn個結點分開。我們通過同時移動兩個指標向前來保持這個恆定的間隔,直到第乙個指標到達最後乙個結點。此時第二個指標將指向從最後乙個結點數起的第n
nn個結點。我們重新鏈結第二個指標所引用的結點的nex
tnext
next
指標指向該結點的下下個結點。
頭指標d的作用是為了方便刪除head
}複雜度分析
19 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?說實話,就我的水平而言感覺這道題坑點還真不少,先來我的乙個粗糙版...
19 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?class solution def removenthfrom...
19 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第n個節點,並且返回鍊錶的頭結點。給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.給定的n保證是有效的。首先遍歷得出鍊錶的長度l,然後刪除第l n個節點 definition for singly linked list....