求出有环链表的起点

1. 问题描述:

给定一个有环的链表,实现一个算法返回环路的开头节点
有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路

2. 这个我们使用到了一个对于判断是否有重复元素非常有效的数据结构HashSet,遍历链表判断当前的HashSet中是否有当前指针指向的元素,如果没有则加入当前元素,如果有那么直接返回这个节点的指针就可以了

3. 具体的代码如下:

import java.util.HashSet;
public class Main {
	private static class ListNode{
		private ListNode next;
		int value;
		public ListNode(int value) {
			super();
			this.value = value;
		}
	}
	
	public static void main(String[] args) {
		//使用一个数据结构HashSet来记录是否重复,使用这个是十分有效的
		ListNode node = new ListNode(1);
		node.next = new ListNode(2);
		node.next.next = new ListNode(3);
		node.next.next.next = new ListNode(4);
		node.next.next.next.next = new ListNode(5);
		//创建环路
		node.next.next.next.next.next = node.next.next;
		node = circleLinedList(node);
		System.out.println(node.value);
	}

	private static ListNode circleLinedList(ListNode node){
		ListNode p = node;
		HashSet<Integer> set = new HashSet<Integer>();
		while(p != null){
			if(set.contains(p.value)) return p;
			set.add(p.value);
			p = p.next;
		}
		return null;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值