1. 程式人生 > >《劍指offer》---輸出鏈表倒數第k個結點

《劍指offer》---輸出鏈表倒數第k個結點

頭結點 ndk 空間 過程 長度 循環 init find tail

本文算法使用python3實現


1. 問題1

1.1 題目描述:

??輸入一個鏈表,輸出該鏈表中倒數第k個結點。
??時間限制:1s;空間限制:32768K


1.2 思路描述:

??方法一:當鏈表長度為 $ n $ 時,輸出鏈表倒數第 $ k $ 個節點,即輸出鏈表正數第 $ n-k $ 個節點。需先遍歷鏈表計算鏈表長度,再從頭至尾查找第 $ n-k $ 個節點,並輸出。
??方法二:可以用兩個指針同時指向鏈表頭結點,第一個指針先遍歷到第k個結點,此時第二個指針指向頭結點,兩個指針的距離為k-1。從此時起,同時後移第一個指針和第二個指針,直到第一個指針的next==None,即第一個指針指向最後一個節點的時候,第二個指針所指向的節點,就是倒數第k個結點。

?? 註意:兩種方法中都需要先判斷k值是否小於零或者鏈表是否為空,此時若是,應返回None;其次第一個指針移向第k個節點的過程中,若循環提前退出,說明鏈表長度小於k,應返回None


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個結點