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

2021-08-28 17:10:36 字數 2017 閱讀 8112

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

單鏈表的python實現

首先說下線性表,線性表是一種最基本,最簡單的資料結構,通俗點講就是一維的儲存資料的結構。順序表示指的是用一組位址連續的儲存單元依次儲存線性表的資料元素,稱為線性表的順序儲存結構或順序映像 鏈式表示指的是用一組任意的儲存單元儲存線性表中的資料元素,稱為線性表的鏈式儲存結構。而他既可以是連續的也可以不連...

單鏈表的Python實現

鍊錶是資料結構中最基本常用的,c 語言中單鏈表是利用指標操作實現的,python作為物件導向程式設計的,可以使用建立乙個node類來實現鍊錶,利用類的屬性引用來代替指標操作。下面我們建立了乙個節點類,然後編寫了幾個鍊錶操作,包括建立,插入,刪除,輸出等 class node 初始化 建構函式 def...

python實現單鏈表

code python code coding utf 8 class node def init self,value self.data value self.next none class linklist def init self,data 0 self.head none self.in...