19.刪除連結串列的倒數第N個結點
阿新 • • 發佈:2021-01-30
19. 刪除連結串列的倒數第 N 個結點
給你一個連結串列,刪除連結串列的倒數第 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
思路:
由於有可能要刪除的是倒數最後一個結點,也即第一個結點,故我們可以建立一個虛擬頭結點dummy
,然後設定快慢指標,fast
和slow
,讓fast
先走n
步,slow
不動,然後fast
和slow
同時走,直到fast
走到盡頭,假設共有m
個結點,則fast
走n
步後,還剩下m-n
個結點,此時fast
和slow
再都走m-n
步,fast
到達盡頭,而slow
還差n
步才到盡頭,而這個位置剛好是我們所要刪除結點的前一位置。
Java程式碼
/**
* 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 dummy = new ListNode(-1);
dummy.next = head;
ListNode fast = dummy,slow = dummy;
//快指標先走n步
for(int i = 0;i < n;i++){
fast = fast.next;
}
//現在快慢指標一起走
while(fast.next != null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummy.next;
}
}