1. 程式人生 > >python實現:找出單鏈表中的倒數第K個元素

python實現:找出單鏈表中的倒數第K個元素

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