為了實現只遍歷鍊錶一次就能找到倒數第k 個結點,我們可以定義兩
個指標。第乙個指標從鍊錶的頭指標開始遍歷向前走k-1步,第二個指標保持不動;從第k 步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k-1 , 當第乙個(走在前面的)指標到達鍊錶的尾結點時,第二個指標(走在後面的)指標正好是倒數第k 個結點
public class test15
/*** 輸入乙個鍵表,輸出該鍊錶中倒數第k 個結點.為了符合大多數人的習慣,
* 本題從1開始計數,即鍊錶的尾結點是倒數第1個結點.例如乙個鍊錶有6個結點,
* 從頭結點開始它們的值依次是1、2、3、4、5 6。這個鍊錶的倒數第3個結點是值為4的結點.
** @param head 鍊錶的頭結點
* @param k 倒數第k個結點
* @return 倒數第k個結點
*/public static listnode findkthtotail(listnode head, int k)
// 指向頭結點
listnode pointer = head;
// 倒數第k個結點與倒數第乙個結點相隔k-1個位置
// pointer先走k-1個位置
for (int i = 1
; i < k; i++)
// 已經沒有節點了,但是i還沒有到達k-1說明k太大,鍊錶中沒有那麼多的元素
else
}// pointer還沒有走到鍊錶的末尾,那麼pointer和head一起走,
// 當pointer走到最後乙個結點即,pointer.next=null時,head就是倒數第k個結點
while (pointer.next != null)
// 返回結果
return head;
}public static void main(string args)
}
面試題15 鍊錶中倒數第K個結點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。鍊錶的節點定義如下,這裡使用的是c 來定義 public cla...
面試題15 鍊錶中倒數第K個結點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。看到這道題目,最直觀的想法,就是先算出鍊錶的長度n,然後倒數第k...
面試題15 鍊錶中倒數第K個結點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。看到這道題目,最直觀的想法,就是先算出鍊錶的長度n,然後倒數第k...