1. 程式人生 > >常見連結串列操作-刪除連結串列倒數第n個節點(JAVA實現)

常見連結串列操作-刪除連結串列倒數第n個節點(JAVA實現)

問題

給出一個單向連結串列,刪除該連結串列倒數第n個節點,並返回頭節點。

例如: 給出連結串列 1->2->3->4->5,n=2 返回連結串列 1->2->3->5

解題思路

最容易想到的演算法: 先遍歷一次連結串列,記下連結串列的長度,然後計算倒數第n個節點的下標m,然後再遍歷一次連結串列,移除第m個節點。 這種演算法的時間複雜度是O(n^2 )。 有沒有時間複雜度更低的演算法呢?答案給是有。

優化後的演算法: 定義兩個指標p和q。 p從頭節點開始,遍歷n個節點,然後q從頭節點開始,與p一起繼續向下遍歷,直到p遍歷出連結串列。 此時q所在的節點就是倒數第n個節點了。 此演算法的時間複雜度為O(n)。

為了方便理解,我畫了下面兩張示意圖。

第一步:

第二步:

程式碼

    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }
    
    public ListNode removeNthFromEnd(ListNode head, int n) {
        if (head == null || n <= 0) {
            return null;
} ListNode p = head; ListNode q = head; int i = 0; while (i < n) { p = p.next; if (p == null) { head = head.next; return head; } i++; } while (p.next != null)
{ p = p.next; q = q.next; } q.next = q.next.next; return head; }

博文地址