C++丨如何检查链表中的循环?这5个方案,真是太绝了!

本文详细介绍了使用C++检测链表循环的5种方法,包括散列法、修改链表数据结构、Floyd算法、临时节点标记和存放长度法。通过实例代码展示了每种方法的实现,帮助读者理解和掌握链表循环检测的技巧。
摘要由CSDN通过智能技术生成

通过5个解决方案教你C++中检测链表中的循环,快来看看,是否对你有帮助!

 

给定一个链表,检查链表是否有循环。下图显示了带有循环的链表。

 

以下是执行此操作的不同方法

解决方案1:散列方法

遍历该列表,并将节点地址始终放在哈希表中。在任何时候,如果达到NULL,则返回false,如果当前节点的下一个指向Hash中先前存储的任何节点,则返回true。

#include <bits/stdc++.h> 

using namespace std; 

struct Node { 

    int data; 

    struct Node* next; 

}; 

 

void push(struct Node** head_ref, int new_data) 

    struct Node* new_node = new Node; 

    new_node->data = new_data; 

    new_node->next = (*head_ref); 

    (*head_ref) = new_node; 

bool detectLoop(struct Node* h) 

    unordered_set<Node*> s; 

    while (h != NULL) { 

        if (s.find(h) != s.end()) 

            return true; 

        s.insert(h); 

 

        h = h->next; 

    } 

 

    return false; 

int main() 

    struct Node* head = NULL; 

 

    push(&head, 20); 

    push(&head, 4); 

    push(&head, 15); 

    push(&head, 10); 

    head->next->next->next->next = head; 

 

    if (detectLoop(head)) 

        cout << "Loop found"; 

    else 

        cout << "No Loop"; 

 

    return 0; 

复杂度分析:

时间复杂度:O(n)。

只需循环一次即可。

辅助空间:O(n)。

n是将值存储在哈希图中所需的空间。

解决方案2:通过修改链表数据结构,无需哈希图即可解决此问题。

方法:此解决方案需要修改基本链表数据结构。

每个节点都有一个访问标志。

遍历链接列表并继续标记访问的节点。

如果您再次看到一个访问过的节点,那么就会有一个循环。该解决方案适用于O(n),但每个节点都需要其他信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值