【C++编程题】高效判断单链表是否有环以及单链表的创建
2017-10-13 18:41
316 查看
在C++下,创建单链表并输出单链表的值:
原本是Leetcode上的一个题目,在不借用额外空间下求单链表是否有循环。但是创建了单链表之后,不知道如何才能将单链表的弄成循环的,所以就仅仅是输出啦。
注意:这种方法的主要思想是定义两个指针fast和slow,slow每次走一步而fast一次走两步,最终如果没环的话,
链表遍历一遍就结束了;若是有环的话,快的链表肯定会与慢的链表相遇的。
之前一直有个思维误区,在有环的情况下fast一次跳两步会不会正好把slow跳过去呢?
后来发现是我多虑了,因为是每次一人走一步的,所以除了在起点以外,fast在环内是一直在slow后面的,而fast最接近slow的时候是离slow只有一步(就是fast->next是slow)或者是两步的。而fast离slow最近的时候两步之内肯定能追上slow。有兴趣的同学可以想一想就算是fast每次走三步,也是完全可以和slow碰面的。只不过要将while循环中多加一句判断语句:
至于原因嘛,~ _ ~ 你肯定能想到的。
#include<iostream> #include<stdlib.h>> using namespace std; struct ListNode{ int val; ListNode *next; }; class Solution{ public: bool hasCycle(ListNode *head){ if(head==NULL||head->next==NULL) { return false; } ListNode *slow,*fast; slow=head; fast=head; // ListNode *slow=head; // ListNode *fast=head; while(fast&&fast->next){ slow=slow->next; fast=fast->next->next; if(fast==slow) return true; cout<<"标记2!"; } cout<<"标记1!"; return false; } }; //构造链表是正确的 void build_list(ListNode *p){ int vals; cout << "Input numbers!" << endl; while((cin>>vals)){ // temp->val=vals; ListNode *t; t=(ListNode*)malloc(sizeof(ListNode)); t->val=vals; p->next=t; p=p->next; } } int main() { Solution sot; bool result; ListNode *p,*head; p=head; build_list(p); //输出 cout<<"result is :"<<endl; for(p=head->next;p!=NULL;p=p->next){ cout<<p->val<<" "; } cout<<endl<<endl; result=true; result=sot.hasCycle(head->next); if(result) //if result is true,there habe cycle,else not cout<<"There have cycle!"<<endl; else cout<<"There no cycle!"<<endl; return 0; }
原本是Leetcode上的一个题目,在不借用额外空间下求单链表是否有循环。但是创建了单链表之后,不知道如何才能将单链表的弄成循环的,所以就仅仅是输出啦。
注意:这种方法的主要思想是定义两个指针fast和slow,slow每次走一步而fast一次走两步,最终如果没环的话,
链表遍历一遍就结束了;若是有环的话,快的链表肯定会与慢的链表相遇的。
之前一直有个思维误区,在有环的情况下fast一次跳两步会不会正好把slow跳过去呢?
后来发现是我多虑了,因为是每次一人走一步的,所以除了在起点以外,fast在环内是一直在slow后面的,而fast最接近slow的时候是离slow只有一步(就是fast->next是slow)或者是两步的。而fast离slow最近的时候两步之内肯定能追上slow。有兴趣的同学可以想一想就算是fast每次走三步,也是完全可以和slow碰面的。只不过要将while循环中多加一句判断语句:
slow=slow->next; if(fast==slow) return true; fast=fast->next->next->next;
至于原因嘛,~ _ ~ 你肯定能想到的。
相关文章推荐
- C/C++ 判断文件夹是否存在以及创建、删除文件夹 windows以及linux通用
- C/C++ 判断文件夹是否存在以及创建、删除文件夹 windows以及linux通用
- C/C++ 判断文件夹是否存在以及创建、删除文件夹 windows以及linux通用
- C/C++ 判断文件夹是否存在以及创建、删除文件夹 windows以及linux通用
- oracle和mysql数据库创建表之前判断表是否存在,如果存在则删除已有表,以及在这两个库中创建表
- [阿里] 判断单链表是否有环 以及 环的位置
- C++ 浮点数(double、float)如何定义NaN、正无穷、负无穷,以及如何判断是否是NaN
- android 获取路径目录方法以及判断目录是否存在,创建目录
- Java单链表基本操作(十)--判断单链表是否有环并输出环长度以及环的入口节点
- android 获取路径目录方法以及判断目录是否存在,创建目录
- 判断单链表是否有环并找到入口处以及判断两个单向链表是否相交
- 判断单链表是否存在环以及求出环的入口
- android 获取路径目录方法以及判断目录是否存在,创建目录
- 数据结构 - 判断单链表是否有环(C++)
- c++编程题练习——检测单链表是否有环,若有,输出环入口
- android 获取路径目录方法以及判断目录是否存在,创建目录
- 判断文件夹是否存在的方法,以及创建文件夹
- android 获取路径目录方法以及判断目录是否存在,创建目录 (转)
- android 获取路径目录方法以及判断目录是否存在,创建目录
- 判断文件夹、文件是否存在、创建文件 c++ matlab