14.輸入一個鏈表,輸出該鏈表中倒數第K個結點。
本題從1開始計數
設置兩個指針,因爲倒數第K的位置與倒數第一的結點位置相距K-1,先讓pointer指針走K-1步,然後讓head與pointer一起往前走,當pointer到達最後一個結點時,head所指的結點就是倒數第K的位置。
public static ListNode findKthToTail(ListNode head, int k) {
// 輸入的鏈表不能爲空,並且k大於0
if (k < 1 || head == null) {
return null;
}
// 指向頭結點
ListNode pointer = head;
// 倒數第k個結點與倒數第一個結點相隔k-1個位置
// pointer先走k-1個位置
for (int i = 1; i < k; i++) {
// 說明還有結點
if (pointer.next != null) {
pointer = pointer.next;
}
// 已經沒有節點了,但是i還沒有到達k-1說明k太大,鏈表中沒有那麼多的元素
else {
// 返回結果
return null;
}
}
// pointer還沒有走到鏈表的末尾,那麼pointer和head一起走,
// 當pointer走到最後一個結點即,pointer.next=null時,head就是倒數第k個結點
while (pointer.next != null) {
head = head.next;
pointer = pointer.next;
}
// 返回結果
return head;
}