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

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

Java程式碼實現:刪除連結串列倒數第 n 個結點

問題描述:
給你一個單向連結串列,刪除連結串列倒數第n個結點,然後返回head結點。這裡的數字n是有效數字。

Given linked list: 1->2->3->4->5, and n = 2.

移除倒數第二個結點之後: 1->2->3->5.

方法一:先遍歷獲取連結串列長度,接著獲取要移除的前一個元素,修改該元素的node.next --> node.next.next。

程式碼如下:

    /**
     * 移除連結串列倒數第n個結點,先遍歷獲取連結串列長度,接著獲取要移除的前一個元素,修改該元素的node.next --> node.next.next。
     *
     * @param head
     * @param n
     * @return
     */
    public SingleNode removeNthFromEnd1(SingleNode head, int n) {
        SingleNode dummy = new SingleNode(0, head);

        //獲取連結串列長度
        int length = 0;
        SingleNode first = head;
        while (first != null) {
            length++;
            first = first.next;
        }

        // 找到角標為(length - n - 1)的結點,讓其next指向下下一個結點。
        first = head;
        int index = 0;
        while (index < length - n - 1) {
            first = first.next;
            index++;
        }
        first.next = first.next.next;
        return dummy.next;
    }

測試程式碼如下:

        SingleLinkedList sll = new SingleLinkedList();
        for (int i = 0; i < 5; i++) {
            sll.addLast(i + 1);
        }
        System.out.println(sll.toString());
        SingleNode node1 = removeNthFromEnd1(sll.getFirst(), 2);
        sll.logFromHead("removeNthFromEnd1", node1);

輸出結果如下:符合預期

I/System.out: SingleLinkedList:[1, 2, 3, 4, 5]
I/System.out: removeNthFromEnd1:[1, 2, 3, 5]

感興趣的同學可自行修改測試用例。

方法二:使用兩個指標,兩個指標保持固定間距n+1,接著開始遍歷。當前面的指標指向null的時候,後面的那個指標剛好指向要移除的結點前一個,我們讓其next指向其next.next即可。

    /**
     * 移除連結串列倒數第n個結點,使用兩個指標實現。
     *
     * @param head
     * @param n
     * @return
     */
    public SingleNode removeNthFromEnd2(SingleNode head, int n) {
        SingleNode dummy = new SingleNode(0, head);
        SingleNode left = dummy;
        SingleNode right = dummy;
        for (int i = 0; i <= n; i++) {
            right = right.next;
        }
        while (right != null) {
            left = left.next;
            right = right.next;
        }
        left.next = left.next.next;
        return dummy.next;
    }

測試程式碼如下:

        SingleLinkedList sll = new SingleLinkedList();
        for (int i = 0; i < 5; i++) {
            sll.addLast(i + 1);
        }
        System.out.println(sll.toString());

        SingleNode node2 = removeNthFromEnd2(sll.getFirst(), 2);
        sll.logFromHead("removeNthFromEnd2", node2);

輸出結果如下:跟預期一致。

    SingleLinkedList:[1, 2, 3, 4, 5]
    removeNthFromEnd2:[1, 2, 3, 5]

完整程式碼請檢視

專案中搜索SingleLinkedList即可。
github傳送門 https://github.com/tinyvampirepudge/DataStructureDemo

gitee傳送門 https://gitee.com/tinytongtong/DataStructureDemo

參考:
1、remove-nth-node-from-end-of-list

2、使用Java實現單向連結串列,並完成連結串列反轉。