1. 程式人生 > 其它 >演算法20 leetcode19 刪除連結串列的倒數第N個節點

演算法20 leetcode19 刪除連結串列的倒數第N個節點

目錄

思路

1

首先想到暴力解,遍歷一遍總長度,然後就可知倒數項是第幾項,然後再次遍歷並計數,然後刪除。

2

看到提示雙指標恍然大悟,直接用滑動視窗就完事了。
但是處理head的時候就出問題了。

3

關鍵點在給頭節點加一個頭節點,但是返回時要返回原來的頭節點!

題目

給你一個連結串列,刪除連結串列的倒數第n個結點,並且返回連結串列的頭結點。


示例 1:
輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]
示例 2:
輸入:head = [1], n = 1
輸出:[]
示例 3:
輸入:head = [1,2], n = 1
輸出:[1]

提示:

連結串列中結點的數目為 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

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

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

程式碼

/** Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        
        ListNode t=new ListNode( 0,head);//頭節點的頭節點
        ListNode hd=t;

        for(ListNode tps=jump(t,n);;tps=jump(t,n)){
             if(tps.next==null){
                //  if(t.next==null) {
                //      head=null;
                //      break;
                //      }
                 t.next=t.next.next;
                 break;
             }
             t=t.next;
        }
        return hd.next;//注意返回
    }
    ListNode jump(ListNode node, int s){//視窗
            ListNode node_s=node;
            for(;s>0;s--){
                if(node_s.next!=null)
                node_s=node_s.next;
            
            }
            return node_s;
    }
}