题目描述
输入一个链表,输出该链表中倒数第k个结点。
输入
{1,2,3,4,5},1
返回值
{5}
代码C++
ListNode* FindKthToTail(ListNode* pHead, int k) {
//方法一:遍历两次,第一次求出链表长度,第二次输出
#if 0
int length = 0;
ListNode* s = pHead;
while (s != NULL)
{
length++;
s = s->next;
}
s = pHead;
int count = 0;
while (s != NULL)
{
count++;
if (count == length - k + 1)
break;
s = s->next;
}
return s;//若输入的链表是NULL
#endif
//方法二:用两个指针s1和s2
#if 1
/*链表的总长度=倒数的长度+顺数的长度
首先s1和s2都指向头结点。先让s1走k步,剩下的到链表的末尾要走的步数就是倒数第k个节点,需要从头开始走的步数
这个时候再让s1和s2同时出发,那么s1到达链尾的时候,正好是s2到达倒数第k个结点的时候
*/
//要考虑到k可能比链表要长,这个时候只能返回NULL
ListNode* s1 = pHead;
ListNode* s2 = pHead;
int i = 1;
for (i; i <= k; i++)//i先加
{
if (s1 == NULL)//判断的是第i步的前一个结点是否为NULL,第i步可能为NULL
return s1;
//break;
s1 = s1->next;//这是第i步
}
while (s1 != NULL)
{
s1 = s1->next;
s2 = s2->next;
}
return s2;
#endif
}
这篇博客介绍了如何在C++中找到链表中倒数第k个节点的方法。提供了两种解决方案,一种是遍历两次链表,另一种是使用两个指针同步移动。这两种方法都能有效地找到目标节点,确保了在k大于链表长度时返回NULL。

1010

被折叠的 条评论
为什么被折叠?



