演算法20 leetcode19 刪除連結串列的倒數第N個節點
阿新 • • 發佈:2021-11-18
目錄
思路
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; } }