判断单链表是否有环(C++)
2016-01-21 15:35
405 查看
问题:判断单链表是否有环(C++)
有一个链表,我们需要判断链表中是否存在环。有环则输出true,否则输出false。
输入有多行,每行为由空格分隔的两个整数m和n,m是当前结点的数据,n代表当前结点的指针域指向第n个结点。
n存在四种情形:
①为-1,代表该结点的指针域指向NULL,输入结束;
②指向该结点之前的结点,如第3个结点的指针域指向n = 2的结点;
③指向自己,如第3个结点的指针域指向n = 3的结点;
④指向其直接后继结点,如第3个结点的指针域指向n = 4的结点,不能指向n = 5的结点。
当输入为:
1 2
2 3
3 -1
时,代表:第1个结点的数据为1,指向第2个结点;第2个结点的数据为2,指向第3个结点;第3个结点的数据为3,指向NULL,输入结束。
样例1
输入:
1 2
3 3
4 2
5 -1
输出:
true
有一个链表,我们需要判断链表中是否存在环。有环则输出true,否则输出false。
输入有多行,每行为由空格分隔的两个整数m和n,m是当前结点的数据,n代表当前结点的指针域指向第n个结点。
n存在四种情形:
①为-1,代表该结点的指针域指向NULL,输入结束;
②指向该结点之前的结点,如第3个结点的指针域指向n = 2的结点;
③指向自己,如第3个结点的指针域指向n = 3的结点;
④指向其直接后继结点,如第3个结点的指针域指向n = 4的结点,不能指向n = 5的结点。
当输入为:
1 2
2 3
3 -1
时,代表:第1个结点的数据为1,指向第2个结点;第2个结点的数据为2,指向第3个结点;第3个结点的数据为3,指向NULL,输入结束。
样例1
输入:
1 2
3 3
4 2
5 -1
输出:
true
#include <memory> #include <vector> #include <iostream> template <typename T> class slist { public: slist() = default; slist(const T &data) : data(new T(data)) { } // ~slist() { std::cout << "destructor" << std::endl; } std::shared_ptr<T> data; std::weak_ptr<slist<T>> next; }; int main(int argc, char *argv[]) { std::vector<std::shared_ptr<slist<int>>> lvec; int val, i, line, nextone; line = 0; while (true) { ++line; std::cin >> val >> nextone; if (!std::cin) { break; } std::shared_ptr<slist<int>> cur, next; if (line > lvec.size()) { cur = std::make_shared<slist<int>>(val); lvec.push_back(cur); } else { lvec[line - 1]->data = std::make_shared<int>(val); } for (i = lvec.size(); i < nextone; ++i) { lvec.push_back(std::make_shared<slist<int>>()); } if (nextone == -1) { break; } lvec[line - 1]->next = lvec[nextone - 1]; } for (const auto &num : lvec) { std::cout << *(num->data) << " "; } std::cout << std::endl; if (lvec.empty()) { return 0; } std::shared_ptr<slist<int>> node1 = lvec[0], node2; if (!node1) { std::cout << std::boolalpha << false << std::endl; return 0; } if (node2 = node1->next.lock()) { if (node2 == node1) { std::cout << std::boolalpha << true << std::endl; return 0; } } else { std::cout << std::boolalpha << false << std::endl; return 0; } while (true) { node1 = node1->next.lock(); node2 = node2->next.lock(); if (!node2) { std::cout << std::boolalpha << false << std::endl; break; } if (node2 == node1) { std::cout << std::boolalpha << true << std::endl; break; } node2 = node2->next.lock(); if (!node2) { std::cout << std::boolalpha << false << std::endl; break; } if (node1 == node2) { std::cout << std::boolalpha << true << std::endl; break; } } return 0; }
// g++ xx.cpp -std=c++11 // gcc 5.3.1
相关文章推荐
- 剖析C++编程中friend关键字所修饰的友元函数和友元类
- C++中声明类的class与声明结构体的struct关键字详解
- 自学c语言第二个/除
- atoi重写
- 【C++】优先队列priority_queue
- c++中const使用详解
- 详解C++中的函数调用和下标以及成员访问运算符的重载
- C语言 百炼成钢4
- 学习C++(2)之类的静态成员及静态成员函数
- 简单了解C++语言中的二元运算符和赋值运算符
- <笔试><面试>C/C++单链表(最综合)最全工程从建立到相关函数实现
- C++/Python
- C语言static
- <笔试><面试>C/C++单链表相关(4)判断两链表是否相交,求交点(链表不带环/可能带环)
- Java与C++的编程差异
- Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的使用方法
- CPP Primer 5th 笔记(一)
- OpenCV人脸识别C++源码分析
- 翠竹林 Opencv+C++之人脸识别
- OpenCV 2.4+ C++ 人脸识别