LeetCode第19題---刪除鏈表的倒數第N個節點

問題描述

給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。

示例:

給定一個鏈表: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.
說明:

給定的 n 保證是有效的。

進階:

你能嘗試使用一趟掃描實現嗎?

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


解題思想

  • 第一種使用兩次遍歷,第一次確定長度,這樣我們才能確定倒數第n個節點在哪裏。
  • 第二種解法就是利用兩個指針指着,但是我們要增加節點,再最後面增加一個節點,在最前面也要增加一個節點,然後後面的指針永遠比前面的指針大n-1位,這樣當到達節點的尾部的時候,前面的指針就指着倒數第n-1個,這個時候利用第n-1個刪除第n個就可以了。

測試用例
因爲是有效的輸入,所以不考慮n無效的情況。(例如小於等於0,n大於長度)
1->10->5 n=2
1 n=1
1->10->20 n=3


代碼

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) { 
         //後面的指針
        ListNode second=new ListNode(0);
        second.next=head;
        //前面的指針
        ListNode first=second;
        
        //有一個指針來記錄根節點
        ListNode root=second;

        //first要先走n+1步
        for(int i=0;i<=n;i++){
            first=first.next;
        }

        //!=next等於在後面增加一個null節點
        while(first!=null){
            first=first.next;
            second=second.next;
        }

        second.next=second.next.next;

        return root.next;

    }
}

總結

這次的代碼化了好長時間,因爲對於鏈表的理解不夠徹底。
當鏈表的表示爲first!=null的時候,其實就是默認給鏈表在尾部增加了一個空節點。
提交截圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章