判断单链表是否有环

呆威 2015-06-25 05:38:55
加精
题目不是看得太懂,请高手帮忙看一下:(用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
...全文
3774 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
侯壮壮 2016-01-29
  • 打赏
  • 举报
回复
#include <iostream> using namespace std; bool isCircle() { bool isCircle = false; int length = 0; int data = 0; int next = 0; while (1){ cin >> data >> next; length++; if (next == -1) { break; } if (next <= length) { isCircle = true; } } return isCircle; } int main() { if(isCircle()){ cout << "true" << endl; } else { cout << "false" << endl; } return 0; }
blueink_200451 2016-01-28
  • 打赏
  • 举报
回复
vioalouyang 2016-01-22
  • 打赏
  • 举报
回复
基本思路是:设置两个指针,一个步长为1,另一个步长为2.开始循环,如果在某一时刻他们相遇了。就是有环。
hi_manman 2016-01-21
  • 打赏
  • 举报
回复
引用 13 楼 Adelaa 的回复:
[quote=引用 2 楼 JiangWenjie2014 的回复:] 题目的意思就是,在一个有向图中判断有没有环路,百度查一下吧。
...[/quote] /////
hi_manman 2016-01-21
  • 打赏
  • 举报
回复
引用 2 楼 JiangWenjie2014 的回复:
题目的意思就是,在一个有向图中判断有没有环路,百度查一下吧。
...
ngo tong 2016-01-21
  • 打赏
  • 举报
回复
// C++11 
#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;
}
Page-hy 2016-01-20
  • 打赏
  • 举报
回复
我是来学习的
我叫小菜菜 2016-01-20
  • 打赏
  • 举报
回复
貌似判断环,都是遍历,每访问一个节点都设置标志位为1,如果访问到某个节点发现标志位已经为1则是有环,结束则无环。
lxp-c 2016-01-20
  • 打赏
  • 举报
回复
http://www.cnblogs.com/shuaiwhu/archive/2012/05/03/2480509.html
Psyduckfang 2016-01-19
  • 打赏
  • 举报
回复
这个问题解决了吗?
lm_whales 2015-06-29
  • 打赏
  • 举报
回复
有啊,这里用静态链表,表示动态链表 简单点,也就是用数组,表示链表,序号表示节点,不能简单+2,+2会跳过 -1 也就是NULL节点
引用 4 楼 mewiteor 的回复:
这没链表什么事啊。直接判断第二个数是不是行号+2(假设行号从0开始)或者-1就可以了嘛
mewiteor 2015-06-26
  • 打赏
  • 举报
回复
这没链表什么事啊。直接判断第二个数是不是行号+2(假设行号从0开始)或者-1就可以了嘛
lm_whales 2015-06-25
  • 打赏
  • 举报
回复
这里没有给你链表数据结构本身,而是用链表中的节点序号代替节点本身(借点数据结构的指针),其中序号为-1 的节点代表NULL指针,表示链表结束。 你只要把序号看作指针,然后和链表求环的同样的方法处理一下即可。
JiangWenjie2014 2015-06-25
  • 打赏
  • 举报
回复
题目的意思就是,在一个有向图中判断有没有环路,百度查一下吧。
fly_dragon_fly 2015-06-25
  • 打赏
  • 举报
回复
遍历就可以了

64,670

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧