C++ 链表求环

方法一(set容器):

(1)将链表中节点的指针插入set容器

(2)在遍历插入节点时,在set容器中查找该节点是否存在。

(3)第一个已存在的节点即为链表环的起点。

//链表求环 方法一
ListNode* detectCycle(ListNode* head)
{
	std::set<ListNode*> node_set;
	while (head)
	{
		if (node_set.find(head) != node_set.end())
			return head;
		node_set.insert(head);
		head = head->next;
	}
	return NULL;
}

方法二(快慢指针):

(1)快指针每次走2步,满指针每次走一步。

(2)当快指针与满指针相遇时,证明有环,相遇点为meet。

(3)meet和head到环的起点的距离相等。(数学证明)

//链表求环 方法二
ListNode* selectCycle(ListNode* head)
{
	ListNode *fast = head;
	ListNode *slow = head;
	ListNode *meet = NULL;
	while (fast)
	{
		slow = slow->next;
		fast = fast->next;
		if (!fast)
		{
			return NULL;
		}
		fast = fast->next;
		if (fast == slow)
		{
			meet = fast;
			break;
		}
	}
	if (meet == NULL)
	{
		return NULL;
	}
	while (head&&meet)
	{
		if (head == meet)
		{
			return head;
		}
		head = head->next;
		meet = meet->next;
	}
	return NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值