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

2021-09-25 18:36:53 字數 1773 閱讀 1832

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1、2、3、4、5、6。這個鍊錶的倒數第3個結點是值為4的結點。

1.簡單的實現方式:

目標是找到鍊錶中倒數第k個節點,那麼從鍊錶頭數的話,也就是整數 n - k +1 (n為鍊錶的長度,k表示倒數第幾個節點)

1.先遍歷一次鍊錶,統計出鍊錶的長度。也就是n的值。

2.再次遍歷,獲取到 第 n - k + 1 的位置的節點值,即 「鍊錶中倒數第k個節點」

2.另一種思路高效的實現方式:

僅遍歷一次鍊錶就可以實現的效果

1.定義兩個指標。pre 和 sub,都指向鍊錶的頭結點

2.pre指標 向鍊錶前移動 k - 1 個位置,sub 指標不移動。

3.當pre指標到達 k - 1 位置之後,pre 和 sub同時向後移動,直到 pre 到達鍊錶的末尾為止。那麼此時sub到達的位置,也就是和pre相隔 k 個位置,也就是鍊錶中倒數 第 k 個節點。

* 166. 鍊錶倒數第n個節點

找到單鏈表倒數第n個節點,保證鍊錶中節點的最少數量為n。

樣例example 1:

input: list = 3->2->1->5->null, n = 2

output: 1

example 2:

input: list = 1->2->3->null, n = 3

output: 1

* @author [email protected]

* @date 2023年4月29日 下午7:51:04

*/public class findkthtotail1

// 如果len == k的話,直接返回頭結點

if (len == k) else if (len < k)

// 倒數第k個節點,也就是正數第n - k + 1 = 4 -k + 1

listnode sub = head;

for (int i = 0; i < (len - k + 1) - 1; i++)

return sub; }

/***

* @param head

* @param k

* @return

*/public static listnode findkthtotail(listnode head, int k)

listnode ahead = head;

listnode behind = null;

for (int i = 0; i < k - 1; i++) else

} behind = head;

while (ahead.next != null)

return behind;

}

public static void main(string args) else

}}

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

題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點.這種考題是比較簡單的一種,以前也碰到過類似的題目,從耗時來說,一般都是使用兩個指標,一前一後的走,中間間隔k或者k 1個步長,這個視判斷語句而定。當前乙個指標走到末端時,後乙個指標正好落在倒數第k個節點處,直接返回該節點。code public c...

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

輸入乙個鍊錶,輸出該鍊錶中倒數第k 個結點。從 1開始計數,即該鍊錶的尾節點是倒數第乙個結點。思路 一 鍊錶是單向鍊錶,只能從頭結點往後依次遍歷,倒數第k 個結點,也就是從頭結點開始的 n k 1 個結點。但是需要先遍歷一遍得到鍊錶長度,然後在找第 n k 1的k 結點。二 1 方法一需要對鍊錶進行...

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

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。分析 兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後再讓第一指標走 k 1 步,即到達第k個結點。然後兩個指標同時開始向後移動,當第乙個指標到達最後的結點時候,第二個結點所在位置就是倒數第k個結點了。author zy date 2017年10月3日...