參考單鏈表反轉中的主類**
鍊錶中有字段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個,其實都是距離 標尺問題。標尺是一段距離可以用線段的兩個端點來衡量...