劍指off 鍊錶中倒數第k個結點

2022-07-24 04:06:13 字數 1893 閱讀 5605

題目:輸入乙個鍊錶,輸出鍊錶中倒數第k個結點,為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如,乙個鍊錶有6個結點,從頭結點開始,它們的值依次是1、2、3、4、5、6.這個鍊錶的倒數第三個結點是值為4的結點。

示例:輸入1 -> 2 -> 3 -> 4 -> 5和k=2; 輸出: 4 -> 5

考點:**的魯棒性

演算法:1、初始化:前指標former,後指標latter;兩個指標均指向頭結點

2、構建雙指標距離:前指標向前移動k-1步。

3、雙指標移動:從第k步開始,兩個指標一起向前移動,直至former指向尾結點。

4、返回值:返回latter即可。

時間複雜度o(n):n為鍊錶長度,former向前走了n-1步,latter向前走了n-k步。

空間複雜度o(1):雙指標former, latter使用常數大小的空間。

根據以上演算法,我們可以寫出以下**:

#

definition for singly-linked list.

#class listnode:

#def __init__(self, x):

#self.val = x

#self.next = none

class

solution:

def getkthfromend(self, head: listnode, k: int) ->listnode:

former = latter =head

for _ in range(k-1):

former =former.next

while

former.next:

latter, former =latter.next, former.next

return latter

但上述**的魯棒性是不夠的,存在三個問題:

鍊錶為空時。由於**會訪問空指標指向的記憶體,從而造成程式的崩潰

輸入的引數k=0;同樣會造成程式的崩潰

鍊錶的結點個數小於k。同樣會存在訪問空指標指向的記憶體而造成程式的崩潰的問題;

改進**:

#

definition for singly-linked list.

#class listnode:

#def __init__(self, x):

#self.val = x

#self.next = none

class

solution:

def getkthfromend(self, head: listnode, k: int) ->listnode:

#空鍊錶

ifnot

head:

return

head

#k = 0

if k ==0:

return

none

former = latter =head

for _ in range(k-1):

#k > 鍊錶長度

if former.next is

notnone:

former =former.next

else

:

return

none

while

former.next:

latter, former =latter.next, former.next

return latter

《劍指offer》 鍊錶中倒數第k個結點

題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點.這種考題是比較簡單的一種,以前也碰到過類似的題目,從耗時來說,一般都是使用兩個指標,一前一後的走,中間間隔k或者k 1個步長,這個視判斷語句而定。當前乙個指標走到末端時,後乙個指標正好落在倒數第k個節點處,直接返回該節點。code public c...

劍指offer 鍊錶中倒數第K個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k 個結點。從 1開始計數,即該鍊錶的尾節點是倒數第乙個結點。思路 一 鍊錶是單向鍊錶,只能從頭結點往後依次遍歷,倒數第k 個結點,也就是從頭結點開始的 n k 1 個結點。但是需要先遍歷一遍得到鍊錶長度,然後在找第 n k 1的k 結點。二 1 方法一需要對鍊錶進行...

劍指 鍊錶中的倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。思路 兩個指標相隔k 1個結點,同時前進,當第乙個的指標到達尾結點時,第二個指標指向的節點即是倒數第k個結點 listnode findkthtotail listnode plisthead,unsigned int k if lengthnext ret...