鍊錶 刪除鍊錶的倒數第 N 個結點

2021-10-21 04:25:27 字數 1965 閱讀 3461

記錄:**於leetcode

在對鍊錶進行操作時,一種常用的技巧是新增乙個啞節點(dummy node),它的next 指標指向鍊錶的頭節點。這樣一來,我們就不需要對頭節點進行特殊的判斷了。

例如,在本題中,如果我們要刪除節點 y,我們需要知道節點 y 的前驅節點 x,並將 x 的指標指向 y 的後繼節點。但由於頭節點不存在前驅節點,因此我們需要在刪除頭節點時進行特殊判斷。但如果我們新增了啞節點,那麼頭節點的前驅節點就是啞節點本身,此時我們就只需要考慮通用的情況即可。

特別地,在某些語言中,由於需要自行對記憶體進行管理。因此在實際的面試中,對於「是否需要釋放被刪除節點對應的空間」這一問題,我們需要和面試官進行積極的溝通以達成一致。下面的**中預設不釋放空間。

一、快慢指標法

思路:使用2個指標,乙個快指標,乙個慢指標,2個指標的出發點都在鍊錶的頭節點。刪除倒數第n個節點。可以先讓快指標向後移動n位,這樣快指標於慢指標之間相差n位。然後2個指標一起向後移動,直到快指標到達鍊錶的最後乙個節點。這樣慢指標的下一位就是需要刪除的倒數第n個節點。使用slow.next = slow.next.next;即可刪除該節點。**如下:

public

static listnode removenthfromend

(listnode head,

int n)

if(fast == null)

return head.next;

listnode slow = head;

while

(fast.next != null)

slow.next = slow.next.next;

return head;

}

二、鍊錶長度計算法

思路:先將鍊錶的長度計算出來,定位到倒數第n個節點的前乙個節點。然後將節點直接連線到他的下下個節點就等於刪除了需要刪除節點。(官方使用了乙個類似於頭節點的,但是這裡為了方便直接使用鍊錶第乙個元素。只需要記錄第乙個節點返回就可以了)

**如下:

/**

* 計算鍊錶長度

* @param head

* @return

*/public

static

intgetlength

(listnode head)

return length;

}/**

* 鍊錶長度計算法

* @param head

* @param n

* @return

*/public

static listnode removenthfromend2

(listnode head,

int n)

flag.next = flag.next.next;

return head;

}

三、棧

思路:棧的特點是後進先出,先將所有的節點入棧,入棧完成後,出棧n個節點。這是棧中的第乙個節點就是目標刪除節點的前乙個節點。在用和上面相同的方法刪除就可以了。**如下:

/**

* 棧* @param head

* @param n

* @return

*/public

static listnode removenthfromend3

(listnode head,

int n)

// 出棧直到目標節點(目標節點也出棧)

while

(n >0)

// 目標節點的前乙個節點

flag = stack.

peek()

; flag.next = flag.next.next;

return head;

}

刪除鍊錶的倒數第N個結點

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點 給定乙個鍊錶 1 2 3 4 5,和 n 2 當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5 class solution listnode dummynode newlistnode 1 dummynode.next head ...

刪除鍊錶的倒數第 N 個結點

給你乙個鍊錶,刪除鍊錶的倒數第 n 個結點,並且返回鍊錶的頭結點。快指標start 慢指標end 此題目需要刪除乙個節點,並且返回新的鍊錶,使用快慢指標法,先移動快指標n個身位,兩個指標相差n 1個節點 再將兩個指標一起移動,當快指標的next為null時,證明已經移動到鍊錶末端,並指向最後乙個節點...

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

題目 給定乙個鍊錶,刪除鍊錶中倒數第n個節點,返回鍊錶的頭節點。注意事項 鍊錶中的節點個數大於等於n 您在真實的面試中是否遇到過這個題?yes 樣例給出鍊錶1 2 3 4 5 null 和 n 2.刪除倒數第二個節點之後,這個鍊錶將變成1 2 3 5 null.思路 這道題的思路十分奇特,那就是為了...