python實現:找出單鏈表中的倒數第K個元素
阿新 • • 發佈:2018-12-13
1、為了找出倒數第k個元素,最容易想到的辦法是首先遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個,接下來遍歷一次就可以得到結果。但是該方法存在一個問題,即需要對連結串列進行兩次遍歷,第一次遍歷用於求解單鏈表的長度,第二次遍歷用於查詢正數第n-k個元素。
# -*- coding: utf-8 -*- """ Created on Thu Oct 4 19:48:31 2018 @author: DELL """ ''' 題目: 輸入一個連結串列,輸出該連結串列中倒數第k個結點 思路: 遍歷歷一次連結串列獲得連結串列長度n,再次遍歷連結串列,至n-k+1出輸出 倒數第K個元素:就索引到n-K-1,因為Python具有前閉後開的特點,所以range裡是n-k ''' class listNode: def __init__(self,val,next): self.val = val self.next = next class Solution: def Find_Kth_to_tail(self,head,K): if head == None or K<=0: return 0 P = head n =1 while p.next != None: p = p.next n = n+1 if k>n: return None for i in range(n-k): head = head.next return head
2、顯然,這種方法還可以進行優化。於是想到了第二種方法,如果從頭至尾的方向從連結串列中的某個元素開始,遍歷k個元素後剛好達到連結串列尾,那麼該元素就是要找到的倒數第k個元素,根據這一性質,可以設計如下演算法:從頭節點開始,依次對連結串列的每一個節點元素進行這樣的測試,遍歷k個元素,檢視是否到達連結串列尾,只到找到哪個倒數第k個元素。此種方法將對同一批元素進行反覆多次的遍歷,對於連結串列中的大部分元素而言,都要遍歷K個元素,如果連結串列長度為n個的話,該演算法的時間複雜度為O(kn)級,效率太低。
3、存在另外一個更高效的方式,只需要一次遍歷即可查詢到倒數第k個元素。由於單鏈表只能從頭到尾依次訪問連結串列的各個節點,因此,如果要找到連結串列的倒數第k個元素的話,也只能從頭到尾進行遍歷查詢,在查詢過程中,設定兩個指標,讓其中一個指標比另一個指標先前移k-1步 ,然後兩個指標同時往前移動。迴圈直到線性的指標值為NULL時,另一個指標所指向的位置就是所要找到的位置。程式碼如下:
# -*- coding: utf-8 -*- """ Created on Thu Oct 4 19:48:31 2018 @author: DELL """ ''' 題目: 輸入一個連結串列,輸出該連結串列中倒數第k個結點 思路: 設定2個指標,第一個指標走K-1步之後,在while判斷時候,第一個指標再走一步,這樣就相當於正好第一個指標走了K步,然後第二個指標開始從頭走,這樣兩個指標之間始終相隔K, 當指標2走到連結串列結尾時,指標1的位置即倒數K個節點 ''' class listNode: def __init__(self,val,next): self.val = val self.next = next class Solution: def Find_Kth_to_tail(self,head,K): if head == None or K<=0: return None P = head q = head for i in range (K-1): if p.next != None: p = p.next return None while p.next != None: p = p.next q = q.next return q