刪除鍊錶中倒數第n個節點

2021-07-26 10:46:30 字數 1364 閱讀 6677

給定乙個鍊錶,刪除鍊錶中倒數第n個節點,返回鍊錶的頭節點。

注意事項:鍊錶中的節點個數大於等於n

樣例

給出鍊錶1->2->3->4->5->null和 n = 2.

刪除倒數第二個節點之後,這個鍊錶將變成1->2->3->5->null.

挑戰

o(n)時間複雜度

如果先遍歷鍊錶,得出鍊錶結點個數,然後再第二次遍歷找出倒數第n個結點。這樣做需要遍歷兩次鍊錶,可不可以只遍歷一次就找到倒數第n個結點呢?可以!

步驟:

1、我們定義兩個指標,第乙個指標ahead開始遍歷到鍊錶的第n-1個結點,第二個指標behind先不動;

2、從第k個結點開始,behind也開始從鍊錶的頭指標(第乙個結點)開始遍歷,直到ahead指標到達鍊錶的尾部結點。這時,behind正好是倒數第n個結點。

3、刪除這個結點。

當然還有特殊情況需要考慮:

1、刪除的結點是頭結點或者尾結點

2、鍊錶只有1個結點

3、鍊錶為空

/**

* definition for listnode.

* public class listnode

* }*/public

class

solution

listnode ahead = head; //第乙個指標

listnode behind = null; //第二個指標

if (n == 1 && ahead.next != null)

ahead.next = null; //刪除最後乙個結點

return head; //返回頭結點

}for (int i = 0; i < n - 1 ; i++) else

}behind = head;

/**while迴圈結束後,因為兩個指標中間相差n-1個位置,所以當ahead到達鍊錶的尾結點之後,behind剛好到達倒數第n個結點

*/while (ahead.next != null)

//將倒數第n個結點的下乙個結點的值賦給倒數第n個結點,相當於刪除倒數第n個結點

behind.val = behind.next.val;

//刪除下乙個結點

behind.next = behind.next.next;

//返回根結點

return head;

}}

刪除鍊錶中倒數第n個節點

刪除鍊錶中倒數第n個節點 給定乙個鍊錶,刪除鍊錶中倒數第n個節點,返回鍊錶的頭節點。樣例 給出鍊錶1 2 3 4 5 null 和 n 2.刪除倒數第二個節點之後,這個鍊錶將變成1 2 3 5 null.definition for listnode.public class listnode pu...

刪除鍊錶中倒數第n個節點

給定乙個鍊錶,刪除鍊錶中倒數第n個節點,返回鍊錶的頭節點。注意事項 鍊錶中的節點個數大於等於n 樣例 給出鍊錶1 2 3 4 5 null和 n 2.刪除倒數第二個節點之後,這個鍊錶將變成1 2 3 5 null.定義兩個指標,slow fast fast先先前走n步後 slow和fast一起走,直...

刪除鍊錶中倒數第n個節點

1 問題描述 給定乙個鍊錶,刪除鍊錶中倒數第n個節點,返回鍊錶的頭節點。給出鍊錶 1 2 3 4 5 null 和 n 2.刪除倒數第二個節點之後,這個鍊錶將變成 1 2 3 5 null.2 實現思路 先計算鍊錶的長度,用for迴圈找到要刪的節點,要考慮鍊錶長度 3 definition of l...