劍指Offer 14 鍊錶中倒數第K個節點

2021-09-24 16:23:31 字數 1151 閱讀 9257

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

思路:

本題其實有很多思路,例如:1、先將鍊錶翻轉,再取第k個元素;2、將鍊錶元素壓入棧中,彈出第k個;3、先計算鍊錶總體長度,再取第n-k個;而這裡用了第四種方法,也是鍊錶的一種常用操作:快慢指標法,即快指標先走k-1步,記住是k-1步,然後慢指標開始走,快指標走到鍊錶末尾的時候,慢指標正好走在鍊錶的倒數第k個元素上。快慢指標法相比於前三種思路,只需要將鍊錶遍歷一遍即可完成倒數第k個元素的返回,要高效很多。另外,快慢指標在鍊錶求中點、鍊錶求環的題目中都有應用,有興趣的同學可以看一下。

solution:

python

# -*- coding:utf-8 -*-

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class solution:

def findkthtotail(self, head, k):

# write code here

if head is none or k == 0: #如果鍊錶為空或者k為0,則返回none,在牛客網上k為0的情況並沒有判斷,即牛客網預設k不為0,但是為了**嚴謹,還是寫上比較好

return none

tmp = listnode(-1) #這裡設定了乙個輔助頭結點,這樣的話fast指標就可以執行k步,而不是k-1步了

tmp.next = head

slow,fast = tmp,tmp

while k and fast.next: #這裡加了fast.next這一判斷是為了防止k大於鍊錶長度的情況,在k大於鍊錶長度時,fast.next為空跳出迴圈

k -= 1

fast = fast.next

if k != 0: #在k大於鍊錶長度時,k在上面的迴圈裡沒有減到0,則直接返回none即可

return none

while fast:

fast = fast.next

slow = slow.next

return slow

劍指Offer (14)鍊錶中倒數第k個結點

題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。實現如下 最後乙個節點定義為倒數第乙個節點 1 2 3 4 5 p s p s eg.尋找倒數第3個節點 k 1 2 要想一次遍歷找到倒數第k個節點,關鍵在於最後乙個節點與倒數第k個節點之間相差k 1個節點 所以要保證兩個指標之間一直保持k 1個節...

劍指offer 14 鍊錶中倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後再讓第乙個指正走 k 1 步,到達第k個節點。然後兩個指標同時往後移動,當第乙個結點到達末尾的時候,第二個結點所在位置就是倒數第k個節點處。public class listnode public cla...

劍指offer14 鍊錶中倒數第k個結點

題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。解決思路 1.備份初始結點 2.計數結點個數 3.判斷是否超出 4.正序遍歷得到第count k個結點 public class solution if countreturn null for int i 0 i這種方法比較笨拙,相當於正序遍歷了...