不管是顺数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 个数呢?自己思考吧。
附完整代码