常見連結串列操作-刪除連結串列倒數第n個節點(JAVA實現)
阿新 • • 發佈:2018-12-16
問題
給出一個單向連結串列,刪除該連結串列倒數第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;
}