LeetCode,141:Linked List Cycle
2015-12-25 10:38
549 查看
Follow up:
Can you solve it without using extra space?
问题需求:
判断出单链表是否带有循环。
问题分析:
对于一个普通的单链表(双向链表以及循环链表不算在内),链表最后一个元素指针==NULL,一个带有循环的单链表,就是链表最后一个结点的指针域,指向链表里的其中一个结点(1,可以指向头个结点,此时最后一个结点的指针域的值==头指针值,2,或者只想最后一个结点本身;3,或者指向其他任意一个结点)。解题关键是使用一快一慢两个的指针,就像操场上面跑步的人,速度不同总有遇上的时候的,遇上那时,两个指针的值相等。
解题思路
采用快慢指针法来实现,每当一个指针跳动两次另外一个指针跳动一次,如果链表示带有循环的,这两指针总会遇上。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ bool hasCycle(struct ListNode *head) { struct ListNode* p = NULL;//这个就是快指针了 struct ListNode* q = NULL;这个就是慢指针了 int i = 0; //如果是一个空链表 //当然就不带循环了 if(head==NULL){ return 0; } //如果链表只有一个元素 //看他是否指向自己,如果指向自己就是带循环的 if(head->next == head){ return 1; } //以下针对链表元素超过两个进行判断 p = head->next; q = head; while(p!=NULL){ p = p->next; //p每移动一次都要判断是否是空,如果是空那就是个普通链表 if(p == NULL){ break; } //两个指针一旦相等就是带有循环的了 if(p == q){ return 1; } //计数保证快的指针每周两次慢的指针才走一次 i = (i+1)%2; if(i==0) q = q->next; } //如果while循环能跳出说明这个链表里面没有循环 return 0; }
相关文章推荐
- 关于sphinx – 我有话要说
- linux centos 6.7下屏幕亮度调节方法
- JS解析查询字符串 parseQueryString
- new Date 生成日期 火狐返回 Invalid Date
- 快速排序 递归与非递归
- 对consistencygroup的一些研究和实践
- tplink 703刷固件
- vc 使用SetWindowPos改变窗体的大小,实现折叠,展开
- ASCII 转换实例
- vs怎么把if语句块for语句块折叠
- Oracle 11g RAC手动打GI PSU补丁(11.2.0.4.8)
- 基础算法学习笔记—快速排序
- Volly框架(一):简单入门(1)
- 在ARM平台上编译安装监控系统monit。
- Android6.0动态权限
- 关于ActiveMQ的问题分析
- jquery盒模型元素尺寸设置
- 常用快捷键总结
- C#基础精华06(Linq To XML,读取xml文件,写入xml)
- C#基础精华06(Linq To XML,读取xml文件,写入xml)