【面试题】判断单链表是否有环
2016-04-05 10:20
344 查看
题目:如何在O(1)空间复杂度的条件下判断单链表是否有环。
思路:采用快慢指针,如果有环,两指针一定会相遇。
图示:
图1:初始化情况,创建两个指针都指向head节点。
图2:p指针为慢指针,每次只走一步;q指针为快指针,每次走两步。
图3:p、q继续往后走。
图4:p、q继续往后走。
图5:p、q继续往后走。
图6:p、q相遇,程序返回true。
如果p、q相遇,则程序返回true,说明该链表有环;若单链表中没有环,则每次判断q->next和q->next->next是否为nullptr,若满足则说明没有环。当单链表只有一个节点或0个节点,返回False。
代码:
思路:采用快慢指针,如果有环,两指针一定会相遇。
图示:
图1:初始化情况,创建两个指针都指向head节点。
图2:p指针为慢指针,每次只走一步;q指针为快指针,每次走两步。
图3:p、q继续往后走。
图4:p、q继续往后走。
图5:p、q继续往后走。
图6:p、q相遇,程序返回true。
如果p、q相遇,则程序返回true,说明该链表有环;若单链表中没有环,则每次判断q->next和q->next->next是否为nullptr,若满足则说明没有环。当单链表只有一个节点或0个节点,返回False。
代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool hasCycle(ListNode *head) { if(head == nullptr || head->next == nullptr) return false; ListNode *p = head, *q = head; while(q->next != nullptr && q->next->next != nullptr) { p = p->next; q = q->next->next; if(p == q) return true; } return false; } };
相关文章推荐
- 老码农冒死揭开行业黑幕:如何编写无法维护的代码[ZZ]
- 面试题23 从上往下打印二叉树
- 怎么在面试时回答java垃圾回收机制相关问题?
- 如何成为一个优秀的程序员(大部分写的都非常不错)——要勤快,不停的学习;争论是无意义的,不如把两种都学了,会更有收获。
- 写给后端程序员的HTTP缓存原理介绍
- 十二星座的程序员都是什么样?
- mysql面试题
- 韩顺平php程序员算法
- 2016年程序员就业形势是什么样的?
- 码农小汪-剑指Offer之33 -数组中的逆序对 冒泡排序 归并排序
- 面试题22 栈的压入、弹出序列
- 面试题21 包含min函数的栈
- 2017滴滴出行实习面试总结(测试岗,拿到offer)
- 面试题20 顺时针打印矩阵
- 2017爱奇艺实习面试总结(搜索开发,拿到offer)
- 程序员学习视频教程汇总
- LeetCode之旅(20)-Power of Three
- 码农小汪-Hibernate学习10-hibernate继承映射 @DiscriminatorColumn DiscriminatorType @Inheritance InheritanceType
- 面试题19 二叉树的镜像
- 安卓面试题