給你乙個鍊錶,刪除鍊錶的倒數第 n 個結點,並且返回鍊錶的頭結點。
由於單向鍊錶沒有指向前乙個節點的指標,所以如果要刪除倒數第n個節點,我們就必須先遍歷一次鍊錶,記錄鍊錶的長度,再遍歷刪除。
我們可以先將鍊錶反轉,這樣一來題目就等於變成了刪除正數第n個節點,那我們就可以直接遍歷到第n個節點,然後原地刪除,最後只需要再將鍊錶反轉回來即可。
public
class
code
system.out.
println
(c.removenthfromend
(head,1)
);}public listnode removenthfromend
(listnode head,
int n)
//反轉鍊錶
listnode pre = null;
listnode cur = head;
while
(cur != null)
//如果是要刪除最後乙個節點,則無需遍歷,直接指向next即可
if(n ==1)
else
//刪除
pnode.next = cnode.next;
}//再反轉回來
listnode pre2 = null;
listnode cur2 = pre;
while
(cur2 != null)
return pre2;
}}
雙指標法,類似快慢指標的道理,讓第乙個指標先走n步,然後再和第二個指標一起走,當第乙個指標走到底時,第二個指標剛好來到n位置
public
class
code
system.out.
println
(head)
; system.out.
println
(c.removenthfromend
(head,1)
);}public listnode removenthfromend
(listnode head,
int n)
//第二個指標
listnode snode = dummy;
//然後兩個指標在一起走,當第乙個指標走完的時候,第二個指標剛好走到了n的前乙個位置
while
(fnode != null)
//刪除n位置的節點
snode.next = snode.next.next;
//返回
return dummy.next;
}}
鍊錶 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和n 2.當刪除了倒數第二個節點後,鍊錶變為1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?definition for singly linked list....
鍊錶 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.說明 給定的 n 保證是有效的。思路 精髓!弄個啞節點,可以直接避免節點數只有乙個的情況。先都指向啞節點,fast先走n 1步。然...
鍊錶 刪除鍊錶的倒數第 N 個結點
記錄 於leetcode 在對鍊錶進行操作時,一種常用的技巧是新增乙個啞節點 dummy node 它的next 指標指向鍊錶的頭節點。這樣一來,我們就不需要對頭節點進行特殊的判斷了。例如,在本題中,如果我們要刪除節點 y,我們需要知道節點 y 的前驅節點 x,並將 x 的指標指向 y 的後繼節點。...