Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-返回倒数第 k 个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的
二、思路分析:
思路一:
- 如果直接遍历,需要遍历两次,可以使用双指针发求解
- 创建两个指针和一个自定义头结点方便定位,两个指针都指向头结点
- 遍历k此,使得两个指针节点之间相差k个节点
- 进行循环移动,每次都将两个指针向后移动一个节点
- 当一个指针指向null时,另一个指针指向的节点即为所求值
思路二: 递归求解
三、AC 代码:
思路一:
/**
* 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 headNode = new ListNode(-1);
headNode.next = head;
ListNode pointer1 = headNode;
ListNode pointer2 = headNode;
for (int i = 0; i < k; i++) {
pointer2 = pointer2.next;
}
while (pointer2 != null) {
pointer2 = pointer2.next;
pointer1 = pointer1.next;
}
return pointer1.val;
}
}
思路二:
class Solution {
int globalVar = 1;
public int kthToLast(ListNode head, int k) {
if (head.next == null) return head.val;
int value = kthToLast(head.next, k);
if (globalVar++ >= k) {
return value;
} else {
return head.val;
}
}
}
四、总结:
- 充分利用条件“给定的 k 保证是有效的”。
- 递归,访问到最后的节点,再往前找之前的状态。
- 双指针,k既是倒数的节点,也是该节点与最末尾节点的距离。