文章目录
题目描述
有一张单链表,编写函数求倒数第K个节点(要求只能遍历一次链表)
示例:
输入
1,{1,2,3,4,5}
返回值
{5}
解答思路
为了能够只遍历一次就能找到倒数第k个节点,可以定义两个指针:
- 第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;
- 从第k步开始,第二个指针也开始从链表的头指针开始遍历;
- 由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。
代码实现:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == nullptr || k == 0) return nullptr;
ListNode* cur = pListHead;
int i = k-1;
while(cur->next != nullptr && i > 0){
cur = cur->next;
--i;
}
if(i > 0) return nullptr;
ListNode* res = pListHead;
while(cur->next != nullptr){
cur = cur->next;
res = res->next;
}
return res;
}
};