輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1、2、3、4、5、6。這個鍊錶的倒數第3個結點是值為4的結點。
1.簡單的實現方式:
目標是找到鍊錶中倒數第k個節點,那麼從鍊錶頭數的話,也就是整數 n - k +1 (n為鍊錶的長度,k表示倒數第幾個節點)2.另一種思路高效的實現方式:1.先遍歷一次鍊錶,統計出鍊錶的長度。也就是n的值。
2.再次遍歷,獲取到 第 n - k + 1 的位置的節點值,即 「鍊錶中倒數第k個節點」
僅遍歷一次鍊錶就可以實現的效果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日...