14.連結串列中倒數第K個結點-劍指offer-Python2.7
阿新 • • 發佈:2018-12-21
題目描述 輸入一個連結串列,輸出該連結串列中倒數第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