求链表中环的入口

链表中没环就返回NULL

有就返回环的入口

三种基本思路:

1、快慢指针找到环内的一个node,然后从链表头开始,对于每一个node,看它在不在环中

2、用map存一下访问过的节点地址,看当前node的地址是否在map中

3、其实,经过计算,对于1中,快慢指针相遇的地方,再开始以慢指针开始走,

另一方面,在链表的头部也用一个慢指针开始走,二者相遇的地方便是环的入口

(代码并未进行运行验证)

typedef struct node
{
	int data;
	struct node * next;
}listNode;
//find the first node in the cycle
//1.step into the circle first and then for every node, take a loop to make sure
//2.store the previous node and compare with the cunrrent node (what structure to store?)
//3.after computation,while using slow and fast pointer,
// we can get that a slow pointer at the begining and another one
// at the encounter position will meet at the entrance of the cycle
listNode *findFirstNodeInCycle1(listNode *pHead)
{
	listNode *pFast=pHead;
	listNode *pSlow=pHead;

	while(pFast!=NULL&&pFast->next!=NULL)
	{
		pFast=pFast->next->next;
		pSlow=pSlow->next;
		if(pSlow==pFast)
			break;
	}

	if(pFast==NULL||pFast->next==NULL)
		return NULL;

	//now the nodes are in the loop
	//begin with the head
	while(pHead)
	{

		pSlow=pSlow->next;
		while(pSlow)
		{
			if(pSlow==pHead)
				return pHead;
			if(pSlow==pFast)
				break;
			pSlow=pSlow->next;
		}
		pHead=pHead->next;
	}
}

//store in a map? good or not?
listNode *findFirstNodeInCycle2(listNode *pHead)
{
	if(pHead==NULL)
		return;
	listNode *temp=pHead-next;

	map<int,char> storeMap;
	map[int(pHead)]=' ';

	while(teamp!=NULL&&storeMap.find(temp)==storeMap.end())
	{
		storeMap[int(temp)]=' ';
		temp=temp->next;
	}

	return temp;
}

listNode *findFirstNodeInCycle3(listNode *pHead)
{
	listNode *pFast=pHead;
	listNode *pSlow=pHead;

	while(pFast!=NULL&&pFast->next!=NULL)
	{
		pFast=pFast->next->next;
		pSlow=pSlow->next;

		if(pFast==pSlow)
		{
			listNode *pSlow2=pHead;
			while(pSlow2!=pSlow)
			{
				pSLow=pSlow->next;
				pSlow2=pSlow2->next;
			}
			return pSlow;
		}
	}
	return NULL;
}
时间: 2024-10-12 20:14:45

求链表中环的入口的相关文章

剑指Offer对答如流系列 - 链表中环的入口节点

面试题23:链表中环的入口节点 问题描述 一个链表中包含环,如何找出环的入口结点?例如,在图中的链表中,环的入口结点是结点3. 链表的结构 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 问题分析 首先不能忽略链表中不包含环的情况,第一件事情必须先确定链表是否有环:我们可以使用两个引用,一个跑的快.一个跑的慢,同时出发,跑的快的追上跑的慢的自然说明有环.(

链表中环的入口结点-剑指Offer

链表中环的入口结点 题目描述 一个链表中包含环,请找出该链表的环的入口结点. 思路 若该链表存在环,设置两个指针pSlow和pFast,pSlow每次走一步,pFast每次走两步,当pFast追上pSlow的时候,pFast比pSlow多走的正好是pSlow走的也就是环所包含的节点的个数. 所以,第二次走,一个从头结点开始,另一个从相遇节点开始,最终会在环的入口节点相遇 代码 /* public class ListNode { int val; ListNode next = null; Li

【单链表】找出单链表中环的“入口”

题目: 找出单链表中环的"入口". 解答步骤: 1.用快慢指针判断是否存在环(慢指针走一步,快指针走两步).若存在环则继续下面的计算,若不存在则返回nullptr: 2.记录快慢指针相遇的节点n0. 3.一个指针从链表头结点出发,另一个指针从n0出发,"同步前进",相遇的节点就是环的"入口". 分析: 由于快慢指针所走的"步数"相同,但快指针每一步是慢指针的两倍,所以快慢指针在n0相遇时,快指针所走距离是慢指针的两倍,即: S

C++实现查找链表中环的入口节点

/* * 寻找链表中环的入口节点.cpp * * Created on: 2018年4月10日 * Author: soyo */ #include<iostream> using namespace std; struct Node{ int num; Node * next; }; Node * creat() { Node *head; Node *p; head=new Node; p=head; p->num=10; p->next=NULL; return head;

剑指offer(二十三,二十四,二十五)最小的k个数,连续子数组的最大和,链表中环的入口节点

23:最小的k个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 简单题.... function GetLeastNumbers_Solution(input, k) { if(k>input.length) return []; let ans = []; input = input.sort(); //console.log(input.join("").slice(0,4).split

剑指offer 55. 链表中环的入口结点

55. 链表中环的入口结点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 法一:(我没看懂) 思路:https://blog.nowcoder.net/n/76e8af2d2fad49f990cde6e6b60a4d79?f=comment 快慢指针,快指针一次走两步,慢指针一次走一步,相遇后,快指针回到头结点,以一次一步的速度和慢指针一起走,再次相遇的结点即是环的入口点 1 public class Solution { 2 3 public ListNo

56 - 链表中环的入口节点

题目: 一个链表中包含环,如何找出环的入口节点? 例如 1->2->3->4->5->6->(3) ; 的链表中,环的入口及诶到哪是节点 3. 解析: 首先找到链表中的环:定义2个指针,一个快指针一次走2步,一个慢指针一次走1步,如果2个指针能够相遇,证明有环. 统计链表中环的长度:从相遇指针开始,固定 1 个指针,另一个指针从相遇指针走,当2个指针再次相遇时,即走了 1 圈,得到环的长度 len. 2个指针指向链表开头,1个指针先走 len 步,另一个指针从头和前一个

剑指offer55:链表中环的入口结点

1 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 2 思路和方法 这是一个典型的链表中查找环的问题,基本思路是,首先设置两个快慢指针slow和fast,并且快指针fast每次前进两步,慢指针slow每次前进一步,假定当相遇的时候,设慢指针在环中走了k步,设环之外的部分长为x,环的长度 为c,则快指针一共走了:x+b1∗c+k步,(b1?为快指针在环中走的圈数)慢指针一共走了:x+b2∗c+k步,(b2?为快指针在环中走的圈数)因为快指针的速度是慢指针的两倍

53、链表中环的入口结点

一.题目 一个链表中包含环,请找出该链表的环的入口结点. 二.解法 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 } 10 */ 11 import java.util.HashSet; 12 public class Solution { 13 public ListNode EntryNodeOfLoop(Lis