【題目】面試題 02.02. 返回倒數第 k 個節點
實現一種算法,找出單向鏈表中倒數第 k 個節點。返回該節點的值。
注意:本題相對原題稍作改動
示例:
輸入: 1->2->3->4->5 和 k = 2
輸出: 4
說明:
給定的 k 保證是有效的。
【解題思路1】快慢指針
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int kthToLast(ListNode head, int k) {
ListNode slow = head;
ListNode fast = head;
while(fast != null){
fast = fast.next;
if(k > 0){
k--;
}else{
slow = slow.next;
}
}
return slow.val;
}
}
【解題思路2】遞歸
// 遞歸
class Solution {
// 開始全局變量 K 保持不變
int K = 1;
public int kthToLast(ListNode head, int k) {
// 當節點在最末尾時觸發返回
if (head.next == null) return head.val;
// 返回的值
int val = kthToLast(head.next, k);
// 一旦觸發返回,從第一個產生返回的位置用 K 計數
if (K++ >= k) {
// 當到達或超過倒數第 k 時,即 K >= k 時保持返回值不變
return val;
} else {
// 沒到達則更新需要返回的值
return head.val;
}
}
}
【題目】 面試題22. 鏈表中倒數第k個節點
輸入一個鏈表,輸出該鏈表中倒數第k個節點。爲了符合大多數人的習慣,本題從1開始計數,即鏈表的尾節點是倒數第1個節點。例如,一個鏈表有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。這個鏈表的倒數第3個節點是值爲4的節點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 k = 2.
返回鏈表 4->5.
和上題的區別是直接return slow