題目:輸入乙個鍊錶,輸出鍊錶中倒數第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...