zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

输出链表的倒数第k个结点(C++)

刷题平台

牛客网

题目

输入一个链表,输出链表中倒数第k个结点。

解题思路

假设两个指针p1,p2,两个指针都指向链表的头指针。

p1指针依次遍历链表,直到移动到第 k 个结点时,p2指针开始从表头开始遍历。

p1和p2两指针继续同时往后遍历(p1和p2两指针的间隔是固定的),直到p1指针指向边表末尾时,p2指针指向的结点就是链表中倒数第 k 个结点。

以下链表输出倒数第2个结点,

p1指针指向第2个结点,p2指针指向第1个结点。image-20200520213343088

p1和p2指针同时向后遍历,直到链表末尾。image-20200520213545576

p2指针指向的结点就是要输出的倒数第 2 个结点。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x):val(x), next(NULL) {}
};

class Solution
{
public:
ListNode *FindKthToTail(ListNode *pListHead, int k)
{
if (pListHead == NULL || k == 0) // 链表为空或要求输出的结点位置不合法
return NULL;
ListNode *p1 = pListHead;
ListNode *p2 = pListHead;
for (int i = 0; i < k-1; i++) // 得到p1指向第 k 个结点的指针
{
if (p1->next != NULL)
p1 = p1->next;
else
return NULL;
}
while (p1->next != NULL) // p1,p2指针同时向后遍历
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
};

参考博文链接:https://cuijiahua.com/blog/2017/12/basis_14.html

文章作者:zerofly

发布时间:2020年05月20日 - 21:05

原始链接:http://zeroflycui.github.io/1c380935.html

许可协议: 转载请保留原文链接及作者。