每天一題LeetCode【第16天】

T19. Remove Nth Node From End of List【Medium

題目

給定一個鏈表,從鏈表的末尾刪除第n個節點并返回它的頭。

例如,

   給出鏈表: 1->2->3->4->5,以及 n = 2.

   在移除了倒數第二個節點后, 鏈表變成了 1->2->3->5.

補充:

給出的 n 總是有效地

嘗試把這題一遍過

思路

① 首先建議不明白鏈表的先了解一下鏈表

② 代碼用start保存首節點,用fast和slow結合起來尋找到目標節點位置

③ 因為鏈表不能從后往前移動,也不知道長度,所以先把 fast 前移 n,保持 slow 和 fast 的差值,把 fast 移動到最后(也就是鏈表常用的 fast==null),然后此時 slow 就能容易的定位到倒數第n個數

④ 鏈表常用去節點方式:slow.next = slow.next.next; 下面舉個例子

鏈表 A->B->C  去掉B:A 放開 B 的尾巴,抓住 C 的尾巴

⑤ 具體看代碼以及注釋~

⑥ 有問題歡迎吐槽哈~

代碼

代碼取自 Top Solution,稍作注釋

/**
 * 給出的ListNode的結構
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
   public ListNode removeNthFromEnd(ListNode head, int n) {
    //初始化一個 val=0 的 ListNode ,并賦給 start,slow,fast
    ListNode start = new ListNode(0);
    ListNode slow = start, fast = start;
    //把傳入的鏈表賦給slow.next
    slow.next = head;
    //把 fast 往前移動 n,使得fast和slow相差n
    for(int i=1; i<=n+1; i++)   {
        fast = fast.next;
    }
    //把fast移動到最后一個, 保持slow一起移動,相差不變,此時slow就是從后往前n
    while(fast != null) {
        slow = slow.next;
        fast = fast.next;
    }
    //通過這句代碼跳過中間的節點
    slow.next = slow.next.next;
    //start用來保存首節點,返回start.next就是首節點
    return start.next;
}
}  

補充

關于代碼中的,debug了一下,slow 和 fast 的地址和 start 是一樣,所以是傳遞地址的,在后面改了任一一個其他的也會改。

 ListNode start = new ListNode(0);
 ListNode slow = start, fast = start;

可以看到地址是相同的(哎這個應該是地址吧)~


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容