视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CCI2.6寻找有环链表环路的开头节点
2020-11-09 15:29:38 责编:小采
文档

给定一个有环链表,实现以算法返回环路的开头结点。 有环链表的定义 在链表中某个节点的next元素指向它前面出现过的节点,则表明该链表存在环路。 示例 输入:A-B-C-D-E-C(C节点出现两次) 输出:C 分析 : 1,快慢指针法判断链表是否有环 fast每次前移两步,

给定一个有环链表,实现以算法返回环路的开头结点。

有环链表的定义

在链表中某个节点的next元素指向它前面出现过的节点,则表明该链表存在环路。

示例

输入:A->B->C->D->E->C(C节点出现两次)

输出:C

分析:

1,快慢指针法判断链表是否有环

fast每次前移两步,slow每次前移一步,两指针若能相遇,则有环,否则没有环。

2,假设链表头到环头移动k步,slow指向环头的时候,fast移动了2*k步,此时两者相距k步,也可以认为快指针再过m*size-k步之后追上慢指针。当两者相遇的时候,则慢指针距离环头还有k步。因为此时不知道k的具体大小,但是知道k是链表头到环头的步数,让fast指向链表头,之后快慢指针每次往后移动一步,两者相遇的地方就是环头。

package test;

public class FindLoopStart {
	public Node findLoopStart(Node head){
	Node fast = head;
	Node slow = head;
	while(fast!=null || fast.next!=null){
	fast = fast.next.next;
	slow = slow.next;
	if(fast == slow)
	break;
	}
	//没有环则返回null
	if(fast==null || fast.next==null)
	return null;
	//相遇之后,slow节点再走k步达到环开头
	//此时,并不知道k的具体值,但是知道k是从链表开头到环头的步数
	//于是,让fast指向链表头,每次往后移一步,则再次相遇的时候,走的步数就是k
	//则相遇地点就是环的开头
	fast = head;
	while(fast != slow){
	fast = fast.next;
	slow = slow.next;
	}
	return slow;
	}
}

下载本文
显示全文
专题