1. 程式人生 > 其它 >19.刪除連結串列的倒數第N個結點

19.刪除連結串列的倒數第N個結點

技術標籤:# 連結串列專題java連結串列leetcode

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,然後設定快慢指標,fastslow,讓fast先走n步,slow不動,然後fastslow同時走,直到fast走到盡頭,假設共有m個結點,則fastn步後,還剩下m-n個結點,此時fastslow再都走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; } }

在這裡插入圖片描述