19#刪除鍊錶的倒數第n個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:
給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:給定的 n 保證是有效的。
高階:
你能嘗試使用一趟掃瞄實現嗎?
這一題可以用兩種方法來做
我們首先需要知道鍊錶的長度l(鍊錶的元素個數count),然後這個問題就轉換為刪除鍊錶中第l-n+1個節點。第一次遍歷,我們計算出鍊錶的長度;第二次遍歷,我們設定乙個指標,將它移動到待刪除指標的前乙個位置,再執行刪除操作。
有乙個關鍵點就是我們要新建乙個輔助指標,放在煉表頭head
的前面,這是為了防止一種特殊情況:被刪除的元素恰好就是第0個元素(即head
)。
/**
* definition for singly-linked list.
* public class listnode
* }*/class solution
count -= n;//第二次遍歷,將指標移動到相應位置
listnode current = assistant;
while (count > 0)
current.next = current.next.next;//刪除操作
return assistant.next; //此處不是return head;
//原因是,head節點可能就是被刪除的那個節點,
//為了避免這種情況,將返回指標設為assistant.next}}
兩次遍歷演算法中,我們只用到了乙個指標。在一次遍歷演算法中,我們要用到兩個指標。同時也需要和剛才一樣,設定乙個輔助指標。
兩個指標的初始位置在輔助指標處(即head
的前面乙個),first
指標先出發,讓它走n+1步,然後讓second
指標出發,這樣,兩個指標之間保持固定的距離n+1,一起移動,直到first
指標抵達鍊錶尾部。此時second
指標就處於待刪除元素的前乙個元素,我們就可以將它的next
指標指向它的下下個節點。
/**
* definition for singly-linked list.
* public class listnode
* }*/class solution
while (first != null)
second.next = second.next.next;
return assistant.next;}}
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....