【经典面试题】寻找单链表倒数第n个节点_C/C++
2011-08-20 15:08
204 查看
面试中经常出现的编程题之一。
最直接的办法是先遍历一遍单链表,记下链表的节点数,然后再次遍历,直到到达节点数减去n的节点,返回结果。实际情况中若链表数目很多而n相对不大,这种方法需要大约两次遍历。更简单的实现方法是采用双指针。一个指针先从链表头开始步进n步,然后另一个指针从头开始,两个指针一同步进直到达到链表尾。这是第二个指针所指的节点即为链表的倒是第n个节点。实现代码如下:
需要注意一些特殊情况的检查:
1.n大于节点数目
2.参数n为0或者负数
3.参数head为空指针
双链表方法可以实现很多问题的解答,还有一个例子是求单链表是否有环。这时可以使用两个链表,一个步进一步,一个步进两部,如果有环两链表就会相遇。
摘自:http://blog.csdn.net/ruizeng88/article/details/6700727
最直接的办法是先遍历一遍单链表,记下链表的节点数,然后再次遍历,直到到达节点数减去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.csdn.net/ruizeng88/article/details/6700727
相关文章推荐
- 经典面试题】寻找单链表倒数第n个节点_C/C++
- 【经典面试题】寻找单链表倒数第n个节点
- 寻找单链表的倒数第N个节点
- 【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】
- 174. 删除链表中倒数第n个节点 (remove-nth-node-from-end-of-list)(c++)----lintcode面试题之链表
- 166. 链表倒数第n个节点(nth-to-last-node-in-list)(c++)----lintcode面试题之链表
- 给定单链表的头结点,如何快速的找到倒数的第n个节点?
- 笔试or面试——寻找单链表倒数第n个元素
- 给定单链表的头结点,如何快速的找到倒数的第n个节点?
- 返回单链表的倒数第n个节点
- [C++]LeetCode 19: Remove Nth Node From End of List(删除链表中倒数第n个节点)
- 寻找单链表的倒数第四个节点
- leetcode_19. Remove Nth Node From End of List 删除单链表中的倒数第n个节点,双指针法
- 删除单链表倒数第n个节点
- 给定单链表的头结点,如何快速的找到倒数的第n个节点?
- C/C++面试之算法系列--一次遍历找链表倒数第n个节点
- 删除单链表的倒数第N个节点
- 【单链表经典面试题解析三】在无头单链表的一个非头节点前插入一个节点(要求不能遍历单链表)
- 寻找链表的倒数第N个节点
- 单链表的逆序和倒数第n个节点