和leetcode的19題很像,19題題解。在鍊錶頭部加入了乙個節點。主要是用了雙指標的方法,先將第乙個指標往前推k個,之後再將第乙個和第二個指標同時向後推,直到第乙個指標為空,這樣能保證這兩個指標之間永遠相隔k個元素。
然而這道題有三種特殊情況:
鍊錶為空
鍊錶長度小於k
k==0
所以我針對這三種情況做了異常處理(劍指offer原書中都返回了空指標,此處與書中不同),定義了異常類myerror,如果是第1、2種情況,那麼就raise myerror(「k大於鍊錶的長度」),丟擲異常,如果是第三種情況,那麼就raise myerror(「k不能為0」),丟擲異常。
之後再用except語句來捕獲異常,同時輸出異常。
except myerror as err:
print
(err)
完整**如下:
# -*- coding:utf-8 -*-
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
myerror
(exception)
:def
__init__
(self, value)
: self.value = value
def__str__
(self)
:return
repr
(self.value)
class
solution
:def
findkthtotail
(self, head, k)
:# write code here
try:
if k ==0:
raise myerror(
"k不能為0"
)# k大於鍊錶的長度
if head is
none
:raise myerror(
"k大於鍊錶的長度"
) he = listnode(0)
he.next
= head
p1 = he
p2 = he
while k:
p1 = p1.
next
# k大於鍊錶的長度
if p1 is
none
:raise myerror(
"k大於鍊錶的長度"
) k -=
1while p1 is
notnone
: p1 = p1.
next
p2 = p2.
next
return p2
except myerror as err:
print
(err)
《劍指offer》 鍊錶中倒數第k個結點
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點.這種考題是比較簡單的一種,以前也碰到過類似的題目,從耗時來說,一般都是使用兩個指標,一前一後的走,中間間隔k或者k 1個步長,這個視判斷語句而定。當前乙個指標走到末端時,後乙個指標正好落在倒數第k個節點處,直接返回該節點。code public c...
劍指offer 鍊錶中倒數第K個結點
輸入乙個鍊錶,輸出該鍊錶中倒數第k 個結點。從 1開始計數,即該鍊錶的尾節點是倒數第乙個結點。思路 一 鍊錶是單向鍊錶,只能從頭結點往後依次遍歷,倒數第k 個結點,也就是從頭結點開始的 n k 1 個結點。但是需要先遍歷一遍得到鍊錶長度,然後在找第 n k 1的k 結點。二 1 方法一需要對鍊錶進行...
劍指Offer 鍊錶中倒數第k個結點
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。分析 兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後再讓第一指標走 k 1 步,即到達第k個結點。然後兩個指標同時開始向後移動,當第乙個指標到達最後的結點時候,第二個結點所在位置就是倒數第k個結點了。author zy date 2017年10月3日...