給定乙個鍊錶,刪除鍊錶中倒數第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...