题目描述
输入一个链表,输出该链表中倒数第k个结点。
题目来源: 牛客网
思路:
这里提供两种思路
- 遍历链表得到链表结点总数 count, 得到count和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) {
ListNode* cur = pListHead;
ListNode* tmp = pListHead;
unsigned int count = 0;
while (cur != nullptr)
{
++count;
cur = cur->next;
}
if (count < k)
return nullptr;
for (int i = 0; i < count - k; ++i)
tmp = tmp->next;
return tmp;
}
};
思路2:
使用两个指针, p2 先走k - 1步, 然后p1, p2 一起开始走, 当p2走到最后一个节点时, p1所在的位置就是相应的节点位置
代码示例:
/*
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 == NULL || k <= 0)
return NULL;
ListNode* p1 = pListHead;
ListNode* p2 = pListHead;
for (int i = k - 1; i > 0; --i)
{
p2 = p2->next;
if (p2 == NULL)
return NULL;
}
for (; p2->next != NULL; p1 = p1->next, p2 = p2->next);
return p1;
}
};