面试中经常出现的编程题之一。
最直接的办法是先遍历一遍单链表,记下链表的节点数,然后再次遍历,直到到达节点数减去n的节点,返回结果。实际情况中若链表数目很多而n相对不大,这种方法需要大约两次遍历。更简单的实现方法是采用双指针。一个指针先从链表头开始步进n步,然后另一个指针从头开始,两个指针一同步进直到达到链表尾。这是第二个指针所指的节点即为链表的倒是第n个节点。实现代码如下:
struct node * lastn(struct node * head, int n){
struct node *p, *q;
if(n < 1){
return NULL;
}
q = head;
while(--n){
if(!q->next){
return NULL;
}
q = q->next;
}
p = head;
while(q->next){
p = p->next;
q = q->next;
}
return p;
} 需要注意一些特殊情况的检查:
1.n大于节点数目
2.参数n为0或者负数
3.参数head为空指针
双链表方法可以实现很多问题的解答,还有一个例子是求单链表是否有环。这时可以使用两个链表,一个步进一步,一个步进两部,如果有环两链表就会相遇。
摘自:http://blog.youkuaiyun.com/ruizeng88/article/details/6700727

本文深入探讨了在链表中寻找倒数第N个节点的方法,并通过双指针技术简化了实现过程。同时,文章还介绍了双链表在解决链表环路检测问题的应用,提供了简洁高效的代码实现。
7万+

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



