通過設定快、慢兩個指標,可以通過一次遍歷得到單向鍊錶的倒數第k個節點。
但兩個問題有著較為明顯的區別:
(1)對於尋找倒數第k個節點,慢指標慢於快指標第k-1步前進。
(2)對於刪除倒數第k個節點,為了保證得到刪除節點父節點的資訊,慢指標要慢於快指標第k步前進。
(3)兩者均要注意當鍊表長度不足時邊界條件的定義。對於刪除問題,尤其要注意刪除第乙個元素(倒數第n個)時,鍊錶head指標的調整。
# 定義單向鍊錶
class
node
(object):
def__init__
(self, value)
: self.value = value
self.
next
=none
def__repr__
(self)
:return f'node()'
class
linklist
(object):
def__init__
(self)
: self.head =
none
def__repr__
(self):if
not self.head:
return
none
nodelist =
node = self.head
while node:
) node = node.
next
return
"-->"
.join(nodelist)
defadd_rear
(self, value):if
not self.head:
self.head = node(value)
else
: node = self.head
while node.
next
: node = node.
next
node.
next
= node(value)
1. 尋找倒數第k個節點def
findlastk
(head:
[none
, node]
, k)
:"""
head: 頭指標
k:倒數第k個
"""if head is
none
or k <=0:
return
none
ahead, bhead = head, head # type: node, 快、慢指標初始均指向煉表頭指標
for i in
range
(k-1):
ahead = ahead.
next
if ahead is
none
:return
none
while ahead.
next
: ahead = ahead.
next
bhead = bhead.
next
return bhead
2. 刪除倒數第k個節點def
dellastk
(linklist:
[none
, linklist]
, k)
:if linklist is
none
or k <=0:
return
none
ahead, bhead = linklist.head, linklist.head # type: node, 快、慢指標初始值均為鍊錶的頭指標
for i in
range
(k):
# 快指標領先k步
if ahead is
none
:return
none
ahead = ahead.
next
if ahead is
none
:# 邊界條件,此時刪除鍊錶第乙個元素,head指標需要重新設定
linklist.head = bhead.
next
else
:while ahead.
next
:# 刪除節點的父節點直接指向刪除節點的子節點
ahead = ahead.
next
bhead = bhead.
next
bhead.
next
= bhead.
next
.next
return linklist
鍊錶刪除倒數第k結點
思想 快指標先走到第k個結點。然後快慢指標一起往後走,當快指標指向最後乙個結點的時候,慢指標就是倒數第k個結點 刪除倒數第k個結點 public static node deletelastkth node list,int k k過大,已經走到末尾了 if fast null return lis...
單向鍊錶中倒數第k個值
本文參考書籍 劍指offer 作者何海濤 01 題目輸入乙個單向鍊錶,輸出該鍊錶中倒數第k個結點。如乙個鍊錶中有6個結點,1,2,3,4,5,6 這個鍊錶的倒數第三個節點是值為4的結點。鍊錶結構如下 02 解題 解法1 獲取鍊錶的第k個值,如果可以知道鍊錶長度n,那麼可以知道從0開始第n k的值是要...
單行鍊錶尋找倒數第k個節點
題目介紹 給出乙個單向鍊錶,輸出該鍊錶的倒數第k個節點 設尾節點開始從0編號 解題思路 兩個指標往後移動,一定要注意邊界的處理情況。此處我設定了乙個頭指標,頭指標不存資料,僅僅作為頭標誌。題目介紹 給出乙個單向鍊錶,輸出該鍊錶的倒數第k個節點 設尾節點開始從0編號 include include i...