链表判环练习
2017-02-23 21:38
169 查看
如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复杂度O(N),额外空间复杂度O(1)。
给定一个单链表的头结点head(注意另一个参数adjust为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。
弗洛伊德判环法,算法证明http://www.cnblogs.com/chengyeliang/p/4454290.html
设置两个指针,为了避免头指针问题设置辅助头节点,快指针每次走两步,慢指针每次走一步,若两个指针没有相遇则无环,如果相遇则有环,相遇之后将快指针节点重新设置为头结点,之后快指针和慢指针每次都只走一步,再次相遇的位置就是环入口。如果不要求空间复杂度为O(1)可以考虑直接利用哈希表判断是否有重复节点。第一次重复的位置就是环入口。
给定一个单链表的头结点head(注意另一个参数adjust为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。
弗洛伊德判环法,算法证明http://www.cnblogs.com/chengyeliang/p/4454290.html
设置两个指针,为了避免头指针问题设置辅助头节点,快指针每次走两步,慢指针每次走一步,若两个指针没有相遇则无环,如果相遇则有环,相遇之后将快指针节点重新设置为头结点,之后快指针和慢指针每次都只走一步,再次相遇的位置就是环入口。如果不要求空间复杂度为O(1)可以考虑直接利用哈希表判断是否有重复节点。第一次重复的位置就是环入口。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };*/ class ChkLoop { public: int chkLoop(ListNode* head, int adjust) { if(!head) return -1; ListNode* prehead=new ListNode(0); prehead->next=head; ListNode* fast=prehead; ListNode* slow=prehead; while(fast&&fast->next) { fast=fast->next->next; slow=slow->next; if(fast==slow) { fast=prehead; while(fast!=slow) { fast=fast->next; slow=slow->next; } return fast->val; } } return -1; } };
相关文章推荐
- 【Weiss】【第03章】练习3.3:通过交换指针交换单/双链表元素
- LeetCode算法练习(合并2个有序链表)
- 数据结构及算法练习--链表相关
- list.h链表练习
- 算法练习,链表二分最大n个
- 第六章堆排序之“用最小堆将k个已排序链表合并为一个排序链表”(练习6.5-8)
- 链表练习:约瑟夫环
- 【数据结构练习】2.两个有序链表序列的合并
- static链表模块练习
- 单链表练习2--倒置或者翻转
- ASP写的链表Class,不太实用,就当练习写Class了。
- 【算法学习笔记】07.数据结构基础 链表 初步练习
- 链表的创建与插入练习
- 练习1:把二元查找树转变成排序的双向链表
- 数据结构练习1——链表合并
- 动态链表练习(单线链表)
- 练习:判断两个无环链表是否相交--C实现
- [算法练习FindLoop]判断单向链表是否存在循环/循环入口/环长度
- 【数据结构练习】基于链表结构实现的队列
- C语言链表练习