判断链表有环set解决法

判断链表是否有环,并返回换起始点

#include <iostream>
#include <set>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
};
ListNode* detectCycle(ListNode* head){
    set<ListNode*> set_node;
    while(head){
        if(set_node.find(head)!=set_node.end()){
            return head;
        }
        set_node.insert(head);
        head=head->next;
    }
    return NULL;//最后一个点不可能成环
}
int main() {
	ListNode a;
	ListNode b;
	ListNode c;
	ListNode d;
	ListNode e;
	ListNode f;
	a.val=1;
	b.val=2;
	c.val=3;
	d.val=4;
	e.val=5;
	f.val=6;
	a.next=&b;
	b.next=&c;
	c.next=&d;
	d.next=&e;
	e.next=&f;
	f.next=&c;
	ListNode* head;
    ListNode* result;
	head=&a;
	result=detectCycle(head);
	cout<<result->val<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用快慢指针的方式来判断链表是否有环。具体实现如下: ```Objective-C // 链表的节点 @interface ListNode : NSObject @property (nonatomic, strong) id value; @property (nonatomic, strong) ListNode *next; @end @implementation ListNode @end // 判断链表是否有环 BOOL hasCycle(ListNode *head) { if (head == nil || head.next == nil) { return NO; } ListNode *slow = head; ListNode *fast = head.next; while (slow != fast) { if (fast == nil || fast.next == nil) { return NO; } slow = slow.next; fast = fast.next.next; } return YES; } ``` 以上代码中,我们使用两个指针slow和fast,开始时它们都指向链表的头节点。slow每次移动一步,fast每次移动两步。如果链表中存在环,则快指针会追上慢指针,并且两个指针会相遇。如果链表中不存在环,则快指针会先到达链表的末尾,此时可以判断链表有环。 使用示例: ```Objective-C ListNode *node1 = [[ListNode alloc] init]; node1.value = @(1); ListNode *node2 = [[ListNode alloc] init]; node2.value = @(2); ListNode *node3 = [[ListNode alloc] init]; node3.value = @(3); ListNode *node4 = [[ListNode alloc] init]; node4.value = @(4); [node1 setNext:node2]; [node2 setNext:node3]; [node3 setNext:node4]; // Uncomment the below line to create a cycle //[node4 setNext:node2]; BOOL hasCycleResult = hasCycle(node1); NSLog(@"链表是否有环:%d", hasCycleResult); ``` 在上面的示例中,我们创建了一个包含4个节点的链表,并且没有环。通过调用`hasCycle`方法判断链表是否有环,最后输出结果为`NO`。 如果你想测试有环的情况,可以取消注释代码中的一行,将第四个节点的下一个节点指向第二个节点,然后再次运行程序,输出结果将为`YES`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值