1. 程式人生 > >刪除連結串列中的倒數第n個節點

刪除連結串列中的倒數第n個節點

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

示例:

給定一個連結串列: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.

說明:

給定的 n 保證是有效的。

進階:

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

題目分析:

一、設快慢指標slow和fast,讓fast先走n-1步,然後再同時後移快慢指標,當快指標移到連結串列末尾的時候,慢指標所指向的節點就是要刪除的節點;

二、但要是刪除連結串列的最後一個元素,即n=1的時候,快慢指標方法就會出現問題,因為fast開始不移動,和慢指標一起後移到最後一個節點的時候要刪除最後一個節點,在刪除最後一個節點的時候,刪除操作會出現空指標報錯,所以行不通;

所以當要刪除最後一個節點的時候就是最簡單的遍歷連結串列刪除,讓fast指標先走一步,然後一起移動,再進行刪除操作。

程式碼實現:

public static class ListNode
{
   int val;
   ListNode next;
   ListNode(int x)
   {
       val = x;
   }
}

public ListNode removeNthFromEnd(ListNode head, int n)
{
   if (n == 1)  //如果是刪除最後一個節點,就遍歷刪除
   {
       if (head == null || head.
next == null) return null; ListNode Pre = head; ListNode temp = head.next; while (temp.next != null) { temp = temp.next; Pre = Pre.next; } Pre.next = null; return head; } int k = n - 1; ListNode slow = head; ListNode fast =
head; for (int i = 0; i < k; i++) { fast = fast.next; } while (fast.next != null) { fast = fast.next; slow = slow.next; } slow.val = slow.next.val; slow.next = slow.next.next; return head; }

主函式:

public static void main(String[] args)
{
   L8 l = new L8();
   ListNode node = new ListNode(1);
   node.next = new ListNode(2);
   node.next.next = new ListNode(3);
   node.next.next.next = new ListNode(4);

   ListNode res = l.removeNthFromEnd(node,2);

   while (res != null)
   {
       System.out.print(res.val + " ");
       res = res.next;
   }
}

執行結果:

1 2 4