求链表倒数第k个结点的思路
时间: 2024-11-30 16:23:03 浏览: 17
要求链表的倒数第 `k` 个节点,一种常见且高效的解法是使用快慢指针(也称为龟兔赛跑的方法)。这个算法维护两个指针:
1. 快速指针(Fast):每次移动两个节点,直到到达链表尾部。
2. 慢速指针(Slow):每次只移动一个节点。
当快速指针到达链表尾部时,慢速指针正好位于倒数第二个位置。此时,只需要再让慢速指针向前移动 `k-1` 步,指向的就是倒数第 `k` 个节点。
下面是 C 语言代码示例:
```c
struct ListNode* findKthToTail(struct ListNode* head, int k) {
if (head == NULL || k <= 0) return NULL;
// 快速和慢速指针初始化为头节点
struct ListNode *fast = head, *slow = head;
// 让快速指针先走 k 步
for (int i = 0; i < k - 1 && fast != NULL; i++) {
fast = fast->next;
}
// 当快指针到达链尾,慢指针则到了倒数第二位置
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
return slow;
}
```
在这个函数中,`head` 是链表的头节点,`k` 是你要找的位置。如果 `k` 小于或等于 0,或者链表为空,函数返回 `NULL`。
阅读全文