返回倒数第 k 个节点
实例要求
- 1、实现一种算法,找出单向链表中倒数第 k 个节点;
- 2、返回该节点的值;
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
实例分析
- 1、定义快慢指针;
- 2、快指针先移动k步、链表长度小于k,返回特殊值;
- 3、快指针和慢指针同时移动,直到快指针到达链表末尾;
- 4、慢指针指向倒数第k个节点;
示例代码
int kthToLast(struct ListNode* head, int k){
if (head == NULL || k <= 0) {
return -1;
}
struct ListNode* fast = head;
struct ListNode* slow = head;
for (int i = 0; i < k; i++) {
if (fast == NULL) {
return -1;
}
fast = fast->next;
}
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
return slow->val;
}
代码解释
- 1、
int kthToLast(struct ListNode* head, int k)
: 这个函数接收一个指向链表头部的指针 head 和一个整数 k,表示要找的倒数第 k 个节点。函数返回倒数第 k 个节点的值; - 2、如果输入的链表头指针为空 head == NULL 或者 k 的值小于等于 0 k <= 0,则返回一个特殊值 -1,表示无效输入;
- 3、接着,定义两个指针 fast 和 slow,初始都指向链表的头部 head;
- 4、使用快慢指针的技巧,快指针 fast 先向前移动 k 步;
- 5、如果链表的长度小于 k,即快指针已经到达链表末尾时仍然为 NULL,则返回特殊值 -1,表示无效输入;
- 6、接着,快指针 fast 和慢指针 slow 同时向前移动,直到快指针 fast 到达链表末尾(
即 fast == NULL
); - 7、此时慢指针 slow 指向的节点就是倒数第 k 个节点,返回其值 slow->val。
运行结果