題目:
請寫一個方法,來刪掉某個LinkedList中,倒數第N個Node
舉例:
假設LinkedList內有1→2→3→4→5
輸入2的話,應該要把4刪掉,變成1→2→3→5
那在開始前不乏提醒一下此系列的固定提醒:
這是一系列逐漸帶入解題的文章,難度會隨著進度增加,若還沒有讀過前面的文章,建議先從最前面開始來逐漸練習解題喔!
我們今天換下一階段的主題,有關資料結構的題目,其實時間有點趕,視情況再做調整好了
那這一題其實算很簡單,但正因為很簡單,題目下面多加註了一項挑戰
「你可以只loop一次就完成嗎?」
大家要知道LinkedList不走完全程,是沒辦法知道長度多長的,我們必須要到前一個Node,才能知道是不是還有下一個
所以要找到倒數第n個,直覺上來說就必須要先loop過一次,知道長度後才找的到對應的Node,接著再刪掉它。那這個做法想必大家都能自己做出來,也就不再多敘述了
那到底要如何只跑一次就完成?
不知道大家有沒有看過有人拉著狗狗跑步,通常是下面這種情況,最多就是兩者併排(狗拉人的話嘛……呃,不在本次討論範圍內)
人
∕
∕
∕
狗
(中間是繩子)
那如果我們把繩子的長度假設為n,假設人站在終點,那狗狗會離人多遠呢?
嗯…………
啊不就是倒數第n個Node的概念嘛!?
我們上程式碼再做解釋:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n)
{
ListNode header = new ListNode(0);
header.next = head;
ListNode fast = header , slow = header;
while(fast.next!=null)
{
fast=fast.next;
if(n<=0) slow=slow.next;
n--;
}
if(slow.next!=null )slow.next=slow.next.next;
return header.next;
}
}
大家可以想像這題就是人拉著狗狗跑步,fast就是人,slow就是狗狗
所以當人跑到終點時,狗狗在的地方就是倒數第n個Node面前,這時我們就可以直接把倒數第n個Node刪掉了
(注意LinkedList刪Node的方法,所以上面的程式碼是在那個Node的上一Node)
奇怪,想到這個比喻後文章長度瞬間縮減,搞定了诶?!