找到鍊錶的倒數第n個結點

2021-09-26 02:50:54 字數 1036 閱讀 3007

**解法一:蠻力法:**從鍊錶的第乙個結點開始,統計當前節點後面的節點個數。如果後面結點的個數小於n-1,那麼演算法結束並返回訊息:「鍊錶中的節點個數不足。」如果數量大於n-1,則移動到下乙個結點(作為新的當前結點)。重複該過程直至當前結點後面的結點個數等於n-1,演算法結束。

時間複雜度為o(n^2)。對於每個結點,都需要從當前結點掃瞄一次鍊錶中剩餘的結點。

空間複雜度o(1)。

**解法二:雜湊表:**使用雜湊表,新建乙個雜湊表,表中的條目是《結點的位置,結點位址》。雜湊表中主鍵是結點在鍊錶中的位置,值是該結點的位址。為了建立雜湊表,當遍歷鍊錶時,可以得到鍊錶的長度。令m表示鍊錶的長度,這樣就將尋找倒數第n個結點的問題轉換成了尋找正數第m-n-1個結點。因為已知鍊錶的長度,所以求解這個問題只需要返回雜湊表中主鍵為m-n-1的值就可以了。

時間複雜度為o(m),主要是建立雜湊表的時間開銷。

空間複雜度為o(m),因為需要建立乙個大小為m的雜湊表

**解法三:**仔細觀察解法二的解決方案,實際上就是求鍊錶的長度。也就是說,該方案使用雜湊表來確定鍊錶的長度,然而,只要從表頭開始遍歷鍊錶,也能得到鍊錶的長度。因此不用建立雜湊表同樣可以求鍊錶的長度。得到長度後,計算m-n+1的值,然後從表頭開始再遍歷一次就能得到m-n+1個結點。這個方法需要遍歷兩次:一次用於確定鍊錶的長度,另一次用於找都從表頭開始的第m-n+1個結點。

時間複雜度等於確定鍊錶長度的時間開銷加上從表頭開始尋找第m-n+1個結點的時間開銷,所以t(n)=o(n)+o(n)≈o(n).因為不需要建立雜湊表,所以空間複雜度為o(1)。

**方案四:**只用一次掃瞄求解,使用兩個指標pnthnode和ptemp。首先,兩個指標都指向鍊錶的表頭結點。僅當ptemp(沿著鍊錶)進行了n次移動,pnthnode才開始移動。然後兩個指標同時移動,直到ptemp移動到表尾。這時pnthnode指標所指的結點即為所求。任何時候,兩個指標每次只向後移動乙個結點。

listnode nthnodefromend(listnode head,int nthnode)

while(ptemp != null)

166 鍊錶倒數第n個結點

原題 您在真實的面試中是否遇到過這個題?是 標籤鍊錶 cracking the coding interview 思路 首先應該清楚,若鍊錶一共有t個結點,則正數第n個結點即倒數第t 1 n個結點。反過來也一樣,倒數第n個結點是正數第t 1 n個結點。明白這點後可以使用兩根指標cur pre來操作。...

刪除鍊錶的倒數第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時,證明已經移動到鍊錶末端,並指向最後乙個節點...