剑指offer-链表中倒数第k个结点

这篇博客介绍了如何在C++中找到链表中倒数第k个节点的方法。提供了两种解决方案,一种是遍历两次链表,另一种是使用两个指针同步移动。这两种方法都能有效地找到目标节点,确保了在k大于链表长度时返回NULL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

输入一个链表,输出该链表中倒数第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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值