剑指offer面试题15——扩展2:判断一个单向链表是否形成环结构
2015-08-05 14:43
666 查看
题目:
判断一个单向链表是否形成了环状结构。和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另外一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环状结构;如果走得快的指针走到了链表的末尾(m_pNext指向NULL)都没有追上走得慢的指针,那么链表就不是环状结构。
本题我的想法是:采用哈希查找来做,从前往后遍历一遍。
判断一个单向链表是否形成了环状结构。和前面的问题一样,定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另外一个指针一次走两步。如果走得快的指针追上了走得慢的指针,那么链表就是环状结构;如果走得快的指针走到了链表的末尾(m_pNext指向NULL)都没有追上走得慢的指针,那么链表就不是环状结构。
本题我的想法是:采用哈希查找来做,从前往后遍历一遍。
#include<iostream> #include<vector> #include<set> using namespace std; //链表的数据结构 struct ListNode { int val; ListNode* next; ListNode(int x):val(x),next(NULL){} }; //创建一个单链表 ListNode* product(vector<int>& vec,int n) { if(n==0) return NULL; ListNode* ptr1=new ListNode(vec[0]); int i=1; ListNode* ptr2=ptr1; while(i<n) { ptr2->next=new ListNode(vec[i]); ptr2=ptr2->next; i++; } return ptr1; } //单链表每个结点的输出 void cout_node(ListNode* root) { if(root==NULL) return; ListNode* ptr1=root; while(ptr1!=NULL) { cout<<ptr1->val<<' '; ptr1=ptr1->next; } cout<<endl; return; } bool ifcircle(ListNode* root) { if(root==NULL) return false; if(root->next==NULL) return false; set<ListNode*> se; ListNode* ptr=root->next; se.insert(root); while(ptr) { if(se.count(ptr)==1) return true; se.insert(ptr); ptr=ptr->next; } return false; } int main() { int ary[10]={1,2,3,4,5,6,7,8,9,10}; vector<int> vec(ary,ary+5); ListNode* root=product(vec,5); cout_node(root); system("pause"); }
相关文章推荐
- ios面试题
- 黑马程序员_Java基础:反射机制(Reflection)总结
- 剑指offer_面试题11_数值的整数次方(*)
- 黑马程序员_Java基础:IO流总结
- 黑马程序员--Java--重要知识点1
- 黑马程序员_Java基础:序列化(Serializable)与反序列化
- 【黑马程序员】Java笔记--单例设计模式
- 在面试那一天,老板问你:准备什么时候离职?
- 最适合程序员使用的图片压缩工具 pngquant
- 《招聘一个靠谱的iOS》面试题参考答案(上)
- 黑马程序员_Java基础:可变参数(Varagrs)的使用注意事项
- 黑马程序员_Java基础:十进制转换其他进制
- 黑马程序员_Java基础:多功能小窗口,swing,io,net综合应用
- 剑指offer面试题15——扩展1:求链表的中间结点
- 黑马程序员_Java基础:实现多线程对共有数据的同步操作
- 面试题:为什么 ["1", "2", "3"].map(parseInt) 返回 [1,NaN,NaN]?
- 黑马程序员-IOS基础之OC框架(Foundation)
- 程序员一生必读的书籍
- 程序员能力矩阵 Programmer Competency Matrix
- 程序员那些事