《leetCode》:Linked List Cycle
2015-11-25 20:26
363 查看
题目
Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space?
题目大意:不能用额外的空间来判断一个链表是否有环。
思路
如果一个链表存在环,当我遍历这个链表时,将我们遍历过的每个节点进行标记,如果被标记的节点又被遍历到的时候就出现了环,基于这样的一个思路就开始写代码,但是问题来了,应该用什么特殊的值来进行标记呢???没有发现,于是发现这个根本就行不通,但是自己还是试了下,用-1000000000作为标记,如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ bool hasCycle(struct ListNode *head) { if(head==NULL){ return false; } struct ListNode *cur=head; struct ListNode *next=head; while(cur->next!=NULL){ if(cur->val!=-1000000000){//设置一个标志位 cur->val=-1000000000; } else{ return true; } cur=cur->next; } return false; }
由于是自己随便选的一个数作为节点遍历过的标记,原以为肯定不能AC,发现居然AC了也,只能说这个测试平台还需要完善。
AC结果如下:
虽然上面的代码AC了,但是自己知道此题的考点并不在此,因此,自己将会继续思考。
思路二
思路:用两个指针来进行遍历即可 ,一个只移动一个节点,一个移动两个节点 ;如果一前一后的节点最终指向了同一个节点,则说明有环,否则无环。实现代码如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ bool hasCycle(struct ListNode *head) { if(head==NULL||head->next==NULL){//没有节点和只有一个节点不会出现环 return false; } struct ListNode *oneStep=head; struct ListNode *twoStep=head->next; while(oneStep!=twoStep){ if(twoStep==NULL||oneStep==NULL||twoStep->next==NULL) return false; else{ oneStep=oneStep->next; twoStep=twoStep->next->next; } } //如果oneStep和twoStep指针指向了同一个节点,则必定有环 return true; }
相关文章推荐
- cf 599 C (模拟+STL)
- 我的android之旅
- SPark pipeline学习
- Node.js + Express + Mongodb 开发搭建个人网站(一)
- HEVC算法和体系结构:预测编码之帧间预测
- HEVC算法和体系结构:预测编码之帧间预测
- codeforces 602 D. Lipshitz Sequence (单调栈)
- HDU_1213
- UVa 1344 - Tian Ji -- The Horse Racing
- Least Common Multiple最小公倍数 17
- Java的一些引用方面的问题
- eclipse快捷键
- 截图
- 实现简易计算器
- linux系统日志
- JSON解析--以百度天气为例
- Big Number大数目 16
- Linux下静态库与动态库的使用
- A/B Testing的简要知识
- Git学习记录-------(一)