判断单链是否循环,并且找出第一个循环节点

介绍

    判断单链是否循环,并且找出第一个循环节点。

思路

    【判断单链是否循环】:如果单链是循环的,那么循环部分就是封闭的。这好比一个田径运动场,当两个人跑步时,开始虽然有一定的间距,但他们迟早会相遇的。

顺其自然的我们从中抽取一个数学模型,一个是步长Steps(对应两人刚开始跑步时的间距);一个是判断单链循环的条件nodeX==nodeY(两人“相遇”)。

    【找出第一个循环节点】:我想过好多其它方法,实现起来都比较难,后来出去骑行了两个小时,回来后就想到借助Hash存储,Hash元素包含判断,结果实现起来既容易,又好懂。

    比如:下图就是一个循环单链,第一个循环节点为3。

package shuai.study.link.circle;

import java.util.HashSet;
import java.util.Set;

class Node {
	String data = null;
	Node nextNode = null;

	public Node(String data, Node nextNode) {
		this.data = data;
		this.nextNode = nextNode;
	}
}

/////////////////////////////////////////////////////////////////////////////////////////

class SingleCircleLink {
	Node firstNode = null;

	Node nodeX = null;
	Node nodeY = null;

	public SingleCircleLink(Node firstNode) {
		this.firstNode = firstNode;

		this.nodeX = firstNode;
		this.nodeY = firstNode;
	}

	public boolean isSingleCircleLink() {
		/*
		 * This while block judge whether this link is circle or not.
		 */
		while (nodeY != null && (nodeY = nodeY.nextNode) != null && nodeX != nodeY) {
			nodeX = nodeX.nextNode;
			nodeY = nodeY.nextNode;
		}

		/*
		 * if Node.next is null, then it illustrates this link isn't circle link.
		 */
		return nodeY != null;
	}

	public void printFirstCircleNode(boolean isSingleCircleLinkFlag) {
		if (isSingleCircleLinkFlag) {
			System.out.println("This is single circle link");

			Set<Node> hashSet = new HashSet<Node>();
			Node nodeZ = firstNode;

			/*
			 * This while block will find the first circle node.
			 */
			while (true) {
				hashSet.add(nodeZ);
				nodeZ = nodeZ.nextNode;

				if (hashSet.contains(nodeZ)) {
					break;
				}
			}

			System.out.println("The first circle node is " + nodeZ.data);
		} else {
			System.out.println("This is not single circle link");
		}
	}
}

/////////////////////////////////////////////////////////////////////////////////////////

/**
 * @author shengshu
 *
 */
public class SingleCircleLinkApp {
	public static void main(String[] args) {
		Node node6 = new Node("6", null);
		Node node5 = new Node("5", node6);
		Node node4 = new Node("4", node5);
		Node node3 = new Node("3", node4);
		Node node2 = new Node("2", node3);
		Node node1 = new Node("1", node2);

		node6.nextNode = node3;

		SingleCircleLink singleCircleLink = new SingleCircleLink(node1);
		singleCircleLink.printFirstCircleNode(singleCircleLink.isSingleCircleLink());
	}
}

				
时间: 2025-01-29 14:28:13

判断单链是否循环,并且找出第一个循环节点的相关文章

PHP中比较两个字符串找出第一个不同字符位置例子

 这是一个在stackoverflow上的问题. 给出两个长度相等的字符串,找出这两个字符串中第一个不同的字符位置. 一般的做法就会这样:    代码如下: <?php for ($offset = 0; $offset < $length; ++$offset) {     if ($str1[$offset] !== $str2[$offset]) {         return $offset;     } } 而问题下面给出的最佳答案是用异或操作符( ^ ),以前从来没用过这个操作符

PHP中比较两个字符串找出第一个不同字符位置例子_php实例

一般的做法就会这样: 复制代码 代码如下: <?phpfor ($offset = 0; $offset < $length; ++$offset) {    if ($str1[$offset] !== $str2[$offset]) {        return $offset;    }} 而问题下面给出的最佳答案是用异或操作符( ^ ),以前从来没用过这个操作符,也不知道能用到什么地方,今天算是学到. 因为一般情况下,当你对两个字符串进行异或操作的时候,相同的字符的异或结果是null

大数据 算法-数据库中有10万条记录,list中有5万条,怎样不通过for循环找出相同的数据?

问题描述 数据库中有10万条记录,list中有5万条,怎样不通过for循环找出相同的数据? java 中 .数据库中有10万条记录 list中有5万条 ,怎样不通过for循环,找出数据库和list中相同的数据? 解决方案 list中的数据批量导入临时表,跟那10W条数据对比,对比完一批删一批,得出相同数据插入另一张临时表, 解决方案二: 其实如果你只是找出相同的数据,你可以直接用SQL接可以了!我写一个SQL语句 select count(*),colName from tableName t

找出txt文件里相似单词的程序

问题描述 现在是有一个txt文件,里面都是单词(从a到z),如图所示.然后用一个Scanner输入单词.比如输入的是quick,相似的单词就是"quack,quirk",然后打印这几个相似的单词.比如输入的是test的话,相似的就是"bestfestjestlestnestpestrestteattenttexttostvestwestzest",然后打印他们.打印出来是这样的:请输入单词:quick系统找到2个相似单词quackquirkList<Strin

[华为机试练习题]61.找出字符串中第一个出现次数最多的字符

题目 描述: 找出字符串中第一个出现次数最多的字符 详细描述: 接口说明 原型: bool FindChar(char* pInputString, char* pChar); 输入参数: char* pInputString:字符串 输出参数(指针指向的内存区域保证有效): char* pChar:出现次数最多的字符 返回值: false 异常失败 true 输出成功 练习阶段: 初级 代码 /*--------------------------------------- * 日期:2015

for循环 乘法表 求解怎么样才能打印出第一列1~9的数字

问题描述 for循环 乘法表 求解怎么样才能打印出第一列1~9的数字 #include #include using namespace std; int main() { int i,j; cout<<" 乘法口诀表 "<<endl; cout<<"--------------------------------------------------"<<endl; cout<<setw(5)<<

JavaScript实现找出字符串中第一个不重复的字符_javascript技巧

此算法仅供参考,小菜基本不懂高深的算法,只能用最朴实的思想去表达. //找出字符串中第一个不重复的字符 // firstUniqueChar("vdctdvc"); --> t function firstUniqueChar(str){ var str = str || "", i = 0, k = "", _char = "", charMap = {}, result = {name: "",i

数组大小为2n+1-数组相关算法java,找出需求的数据

问题描述 数组相关算法java,找出需求的数据 存在一个数组,数组大小为2n+2,里面有n对个数,例如:1,2,2,3,4,1.(数组是无序的,考虑排序的话一定会超过限制)这,6个数中的单独的数就是3,4,要你用你能想到的最高效率的方法找出来 解决方案 如果数组是连续的则可以用byte[] b = new byte[n+1];然后遍历一遍原数组,将遍历的值放入b的下标中计数,最后为1的那个下标表示数据是单独的. 这样的话总最多做3n+3次操作就能找全单独的数. 如果数组里面的数是无规律的,那么可

[C#]找出最大分子式,要是用StingBuilder要怎么写,求代码

问题描述 有这样一组数{12,4,5,6,5,8,10,7,16,14,18,30},找出这组数的最大子分式.子分式的定义:从这组数的第一个数开始连续的升序直到出现不符合的数结束,这样的一组数为子分式.例如{2,3,4,5,4,6,3}这组子分式为{2,3,4,5}{4,6}{3} 解决方案 解决方案二:StringBuilder是用来拼接string的,和你的题目没关系而且昨天那贴已经有很多答案了.解决方案三:循环被.当前跟下一个对比.如果+1==下一个就添加到集合中.如果不等于就开辟一个新的