1. 程式人生 > >14.連結串列中倒數第K個結點-劍指offer-Python2.7

14.連結串列中倒數第K個結點-劍指offer-Python2.7

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。

思路1 要想找到倒數第k個結點,我們可以先求出連結串列的總長度,然後就可以找到倒數第k個結點在連結串列中的位置,之後再遍歷一遍連結串列,直到遍歷到要求結點的位置時終止遍歷。注意:輸入的連結串列可能為空;k可能大於連結串列的長度;k可能為0,這些情況我們都返回空。

Python2.7編寫

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        #如果連結串列為空或者要得到的是倒數第0個結點,則返回空
        if not head or k == 0:
            return
        p = head #用於求連結串列長度
        q = head #用於找到倒數第k個結點
        cnt = 0 #記錄陣列長度
        while p:
            cnt += 1
            p = p.next
        #如果要得到的節點編號大於連結串列總長度,則返回空
        if k > cnt: 
            return
        #倒數第k個結點的在連結串列中的位置
        target = cnt - k + 1 
        cnt_n = 0 #用於記錄走過連結串列的長度
        #當走到要求結點的前一個節點時,停止。此時q指向的結點即為要求的結點。
        while target - 1 != cnt_n:
            q = q.next
            cnt_n += 1
        return q

思路2 第一種思路需要遍歷連結串列2次,耗時較多。第二種思路可以只遍歷一遍連結串列找出倒數第k個結點。 設定兩個指標p,q分別指向頭結點,第一個指標p向前走k-1步,此時指標p指向正數第k個結點,在這個過程中保持第二個指標不動。接下來讓指標p和q同時移動,每次移一步,這樣當指標p指向尾結點的時候,指標q指向倒數第k個結點。同樣需要注意:輸入的連結串列可能為空;k可能大於連結串列的長度;k可能為0,這些情況我們都返回空。

# -*- coding:utf-8 -*-
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def FindKthToTail(self, head, k):
        #確保魯棒性:連結串列為空以及k為0時的情況
        if not head or k == 0:
            return None
        
        p = head
        q = head
        #當for迴圈終止的時候,指標p指向正數第k個結點
        #此時如果k的值大於連結串列的長度,則p.next為None,則直接返回None
        for i in range(k - 1):
            if p.next != None:
                p = p.next
            else:
                return None
        #指標p和指標q同時移動,當指標p到達尾結點的時候,指標q指向倒數第k個結點
        while p.next != None:
            p = p.next
            q = q.next
        return q