获取单链表中倒数第N个结点数据

本文介绍了如何通过双指针法解决获取单链表中倒数第N个节点的问题。利用两个指针,一个先走N步,然后两者同步前进,当先走的指针到达链表末尾时,另一个指针所处位置即为倒数第N个节点。这种方法基于‘距离-标尺’的思维,对于寻找整数第N个节点也可采用类似思路。
摘要由CSDN通过智能技术生成

不管是顺数n个还是倒数n个,其实都是距离-标尺问题。标尺是一段距离可以用线段的两个端点来衡量,我们能够判断倒数第一个节点,因为他的next==NULL。如果我们用两个指针,并保持他们的距离为n,那么当这个线段的右端指向末尾节点时,左端节点就指向倒数第n个节点。
所以思路出来了:建立两个指针,第一个先走n步,然后第2个指针也开始走,两个指针步伐(前进速度)一致。当第一个结点走到链表末尾时,第二个节点的位置就是我们需要的倒数第n个节点的值。

while (i < n && firstNode->next != NULL)
{
	//正数N个节点,firstNode指向正的第N个节点
	i++;
	firstNode = firstNode->next;
	printf("%d\n", i);
}

然后两个节点都开始走。 firstNode 从停下的地方继续走,而 secNode 则是从表头开始走。很明显,当 firstNode 走到表尾的时候,secNode 就正好走到表的倒数第 n 个数了。

while (firstNode != NULL)
{
	//查找倒数第N个元素
	secNode = secNode->next;
	firstNode = firstNode->next;
	//printf("secNode:%d\n", secNode->data);
	//printf("firstNode:%d\n", firstNode->data);
}

这个是“距离 - 标尺”的典型例子。求整数第 n 个数呢?自己思考吧。
附完整代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值