刪除單鏈表中倒數第n個節點(JAVA)

2021-09-12 14:19:50 字數 2322 閱讀 6765

參考單鏈表反轉中的主類**

鍊錶中有字段size是節點總個數

倒數第lastnum個節點就是正數第size-lastnum+1個節點,index=size-lastnum

刪除操作需要拿到倒數第lastnum+1個節點來完成,即正數第size-lastnum個節點,index=size-lastnum-1

把該節點的next設定為該節點的next.next即可

public

void

deletebylastnum

(int lastnum)

if(lastnum == size)

// 倒數第lastnum個節點,就是正數第size-lastnum+1個節點,如果從0開始用index標記則是size-lastnum

// 刪除它就是把index=size-lastnum-1的next設定為index為size-lastnum的next

singlylinkednode

current =

this

.getheader()

;int pos =0;

while

(pos != size - lastnum -1)

singlylinkednode

remove = current.

getnext()

; current.

setnext

(remove.

getnext()

);remove.

setnext

(null)

; remove = null;

// gc

size--

;}

上述的解決方案其實依賴鍊錶的長度size,如果鍊錶沒有size則需要先從header移動到尾部求出size網路上看到的快慢指標法則不需要使用size我自己理解這個挺笨拙的,就需要舉個實際例子來明白

需要找的節點和上述的一致,如果要刪掉倒數第lastnum個節點,需要拿到倒數第lastnum+1個節點

網路上的快慢指標法就是在定位該節點時用了一種很巧妙的方法

先讓快指標從header開始向後移動lastnum步,這時候快指標在index=lastnum位置

接著慢指標也從header開始,和快指標以相同步長1向後移動,迴圈條件是快指標的current.getnext() != null。之所以不使用current != null是因為這樣會拿到被刪除節點本身,而這裡需要拿到被刪除節點的前乙個節點

public

void

deletebylastnum2

(int lastnum)

faster = faster.

getnext()

;}if(faster ==

this

.getheader()

)// 需要加乙個對faster的空指標校驗,不然後邊會報錯

if(faster == null)

singlylinkednode

lower =

this

.getheader()

;while

(faster.

getnext()

!= null)

singlylinkednode

remove = lower.

getnext()

; lower.

setnext

(remove.

getnext()

);remove.

setnext

(null)

; remove = null;

// gc

this

.size--

;}

因為鍊錶類中定義了size,**裡也相應處理了它,如果定義的鍊錶類中沒有該字段則不需要

刪除單鏈表倒數第n個節點

如何刪除單鏈表中的倒數第n個節點?先遍歷一遍單鏈表,計算出單鏈表的長度,然後,從單鏈表頭部刪除指定的節點。description 刪除單鏈表倒數第n個節點,常規解法.param head param n return listnode public static listnode removenth...

刪除單鏈表的倒數第n個節點

題目描述 給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和n 2.當刪除了倒數第二個節點後,鍊錶變為1 2 3 5.說明 給定的 n 保證是有效的。解題思路 本人使用雙指標法 首先建立乙個虛擬頭節點 dummyhead 作為給定頭節點的上乙...

查詢單鏈表中倒數第n個節點

通過一次遍歷找到單鏈表中倒數第n個節點,鍊錶可能相當大,可使用輔助空間,但是輔助空間的數目必須固定,不能和n有關。單向鍊錶的特點是遍歷到末尾後不能反向重數n個節點。因此必須在到達尾部的同時找到倒數第n個節點。不管是順數n個還是倒數n個,其實都是距離 標尺問題。標尺是一段距離可以用線段的兩個端點來衡量...