《劍指offer》---輸出鏈表倒數第k個結點
阿新 • • 發佈:2018-05-20
頭結點 ndk 空間 過程 長度 循環 init find tail
?? 註意:兩種方法中都需要先判斷k值是否小於零或者鏈表是否為空,此時若是,應返回None;其次第一個指針移向第k個節點的過程中,若循環提前退出,說明鏈表長度小於k,應返回None
本文算法使用python3實現
1. 問題1
1.1 題目描述:
??輸入一個鏈表,輸出該鏈表中倒數第k個結點。
??時間限制:1s;空間限制:32768K
1.2 思路描述:
??方法一:當鏈表長度為 $ n $ 時,輸出鏈表倒數第 $ k $ 個節點,即輸出鏈表正數第 $ n-k $ 個節點。需先遍歷鏈表計算鏈表長度,再從頭至尾查找第 $ n-k $ 個節點,並輸出。
??方法二:可以用兩個指針同時指向鏈表頭結點,第一個指針先遍歷到第k個結點,此時第二個指針指向頭結點,兩個指針的距離為k-1。從此時起,同時後移第一個指針和第二個指針,直到第一個指針的next==None,即第一個指針指向最後一個節點的時候,第二個指針所指向的節點,就是倒數第k個結點。
1.3 程序代碼:
(1)方法一
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
'''統計鏈表個數,輸出第n-k個(註意是返回節點,不是返回節點的值)'''
# 鏈表為空或k小於0
if head == None or k <= 0:
return None
p = head
lens = 0
while p!= None:
lens += 1
p = p.next
# k值大於鏈表長度
if k > lens:
return None
i = 0
q = head
while i < lens-k:
q = q.next
i += 1
return q
(2)方法二:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
''' 可以用兩個指針,一個指針遍歷到第k個結點的時候,第二個指針再走到第一個節點,
然後兩個指針的距離始終保持k-1,這樣,當第一個指針的next==NULL,也就是走到最後一個節點的時候,
第二個指針對應的位置,就是倒數第k個結點。'''
if head == None or k <= 0:
return None
p1 = head
p1Count = 1
p2 = head
while p1 != None and p1Count < k:
p1 = p1.next
p1Count += 1
# 當k大於鏈表長度時
if p1 == None:
return None
while p1.next != None:
p1 = p1.next
p2 = p2.next
return p2
《劍指offer》---輸出鏈表倒數第k個結點