1. 程式人生 > >LeedCode--【19】--【刪除連結串列的倒數第 n 個節點】

LeedCode--【19】--【刪除連結串列的倒數第 n 個節點】

一、原題要求:

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

示例:

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

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

說明:

給定的 n 保證是有效的。

進階:

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

思路:
            使用兩個指標,第一個指標先向前移動 n步,此時,同時移動兩個指標向前移動,一次一個節點;直到第一個指標到達最後一個結點。此時第二個指標的下一個節點就是倒數第n個節點。重新連結第二個指標所指向的結點就可以了;即:next 指標指向該結點的下下個結點。

 

二、程式碼實現

1、Solution .java

public class Solution {
    /**
     * <pre>
     *給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。
     *
     * 示例:
     *
     * 給定一個連結串列: 1->2->3->4->5, 和 n = 2.
     *
     * 當刪除了倒數第二個節點後,連結串列變為 1->2->3->5.
     * 說明:
     *
     * 給定的 n 保證是有效的。
     *
     *
     * 解題思路
     * 先讓一個指標走找到第N個節點,然後再讓一個指標指向頭結點,然後兩具指標一起走,
     * 直到前一個指標直到了末尾,後一個指標就是倒數第N+1個結點,刪除倒數第N個結點就可以了。
     * </pre>
     *
     * @param head
     * @param n
     * @return
     */
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if(head == null && head.next == null){
            return null;
        }

        ListNode pre = new ListNode(0); // 建立一個臨時指標
        pre.next = head;
        ListNode slow = pre; // 慢指標
        ListNode fast = pre; // 快指標

        for(int i = 0; i < n; i++){  // 快指標先走n步,找到第n個結點
            fast = fast.next;
        }

        while(fast.next != null){ // 一起走
            fast = fast.next;
            slow = slow.next;
        }

        slow.next = slow.next.next;
        return pre.next;
    }
}

2、Main .java

public class Main {
    public static void main(String[] args) {
        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(2);
        ListNode n3 = new ListNode(3);
        ListNode n4 = new ListNode(4);
        ListNode n5 = new ListNode(5);
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        n4.next = n5;
        System.out.print("初始連結串列:");
        print(n1);

        Solution solution = new Solution();
        ListNode head = solution.removeNthFromEnd(n1, 2);

        System.out.print("最終連結串列:");
        print(head);
    }
    private static void print(ListNode head) {
        for (ListNode temp = head; temp != null; temp = temp.next){
            System.out.print(temp.val + "->");
        }
        System.out.println("null");
    }
}

2、ListNode .java

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