劍指offer面試題15 連結串列中倒數第K個結點
一、題目
輸入一個連結串列,輸出該連結串列中倒數第K個結點。為符合大多數人的習慣,本題從1開始計數,即連結串列的尾結點是倒數第1個結點。例如一個連結串列有6個結點,從頭結點開始它們的值依次是1,2,3,4,5,6.則這個連結串列的倒數第3個結點為4.
二、思考與分析
因為本題中的連結串列是單向連結串列,單向連結串列的結點只有從前向後的指標而沒有從後往前的指標,因此不可能從尾結點向前回溯K步。
2.1 方法一
需要遍歷兩次連結串列,第一次統計出連結串列中結點的個數,第二次就能找到倒數第K個結點,即從頭結點開始的第(n-k+1)的結點。
2.2 方法二
只需要遍歷一次連結串列,利用步長為(K-1的)尺子。
為了實現只遍歷連結串列一次就能找到倒數第K個結點,可以定義兩個指標。第一個指標從連結串列的頭指標開始遍歷向前走K-1步,第二個指標保持不動,這樣就形成了一個步長為(K-1)的尺子。從第K步開始,第二個指標也開始從連結串列的頭指標開始遍歷。直到第一個指標直到尾結點時,第二個指標正好是倒數第K個結點。
在有6個結點的連結串列上找倒數第3個結點的過程
- 第一個指標在連結串列上走2(K-1)步,第二個指標保持不動;
- 從第3步開始,第二個指標和第一個指標同步向前移動,直到第一個指標到達尾結點。
2.3 程式碼實現
注意程式碼的魯棒性:
* 輸入連結串列為空時,即頭結點為空時,程式是否有處理?
* 輸入連結串列的長度小於K時,由於for迴圈會在連結串列上向前走K-1步,可能會因為空指標造成程式崩潰,對於這種情況程式是否有處理?
* 輸入的引數K為0是,那麼for迴圈在連結串列上向前走K-1步,即-1步,K是一個無符號整數,-1即為0XFFFFFFFF,因此for迴圈的次數會遠遠超出我們的預計,會造成程式崩潰,這種情況程式是否有處理?
public ListNode FindKthToTail(ListNode head,int k) {
if (head == null || k == 0) {
return null;
}
ListNode n1 = head;
ListNode n2 = head;
for (int i = 0; i < (k-1); i++) {
if (n1.next != null) {
n1 = n1.next;
} else {
return null;
}
}
while (n1.next != null) {
n1 = n1.next;
n2 = n2.next;
}
return n2;
}
相關文章
- 連結串列面試題(六)---刪除單連結串列倒數第k個結點面試題
- 連結串列面試題(五)---尋找連結串列的倒數第k個結點O(N)面試題
- 單連結串列倒數第k結點輸出
- [每日一題] 第十三題:連結串列中倒數第k個節點每日一題
- 劍指offer面試16 反轉連結串列面試
- LeetCode題解(Offer22):尋找連結串列中倒數第k個節點(Python)LeetCodePython
- 《Cracking the Coding Interview程式設計師面試金典》----連結串列中倒數第k個結點View程式設計師面試
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- PHPer也刷《劍指Offer》之連結串列PHP
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 劍指offer:刪去連結串列中重複的節點。(題解原始碼加圖解)原始碼圖解
- leetcode每日一題—19.刪除連結串列的倒數第N個結點LeetCode每日一題
- 劍指offer(java實現)第3題“從尾到頭列印連結串列”-牛客網Java
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 用一個儘可能高效的演算法,查詢單向連結串列(有頭結點)中倒數第k個位置上的結點演算法
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 《劍指offer》:[37]如何得到連結串列環的入口地址
- 牛客網高頻演算法題系列-BM8-連結串列中倒數最後k個結點演算法
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- [CareerCup] 2.2 Kth to Last Element of Linked List 連結串列的倒數第k個元素AST
- Leetcode No.19 刪除連結串列的倒數第N個節點LeetCode
- LeetCode- 19 刪除連結串列的倒數第N個節點LeetCode
- 查詢連結串列中倒數第k(k為正整數)個位置上的結點,查詢成功輸出該結點的data值,並返回1,否則只返回0
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- 劍指offer面試18 樹的子結構面試
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- LeetCode 刷題日記 19. 刪除連結串列的倒數第N個節點LeetCode
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 連結串列面試題(一)---刪除一個無頭單連結串列的非尾結點面試題
- LeetCode19題 刪除連結串列的倒數第N個節點 (c++ 遞迴)LeetCodeC++遞迴
- [LeetCode] Remove Nth Node From End of List 移除連結串列倒數第N個節點LeetCodeREM
- 劍指offer面試題11 數值的整數次方面試題
- 04天【程式碼隨想錄演算法訓練營34期】 第二章 連結串列part02 (● 24. 兩兩交換連結串列中的節點 ● 19.刪除連結串列的倒數第N個節點 ● 面試題 02.07. 連結串列相交 ● 142.環形連結串列II )演算法面試題
- 劍指 Offer 15. 二進位制中1的個數
- 連結串列面試題(九)---判斷一個連結串列是否帶環面試題