`

java 判断单链表是否有环

 
阅读更多
两个指针h1,h2都从头开始遍历单链表,h1每次向前走1步,h2每次向前走2步,如果h2碰到了NULL,说明环不存在;如果h2碰到本应在身后的h1说明环存在(也就是发生了套圈)。
    如果环不存在,一定是h2先碰到NULL:

    如果环存在,h2与h1一定会相遇,而且相遇的点在环内:h2比h1遍历的速度快,一定不会在开始的那段非环的链表部分相遇,所以当h1,h2都进入环后,h2每次移动都会使h2与h1之间在前进方向上的差距缩小1,最后,会使得h1和h2差距减少为0,也即相遇。

public class LinkedListNode {

	private static boolean isLoop(NodeList p)
	{
		NodeEntity slow = p.head ;
		NodeEntity fast = p.head ;
		
		while(fast!=null&&fast.next!=null)
		{
			slow = slow.next;  
		    fast = fast.next.next;
		    if(slow==fast)
		    {
		    	return true ;
		    }
		}
		return false ;
	}
	public static void main(String[] args) {
		NodeList list = new NodeList();
		
		for(int i=0;i<3;i++)
		{
			list.add(i);
		}
		
		System.out.println(isLoop(list));
		System.out.println(list.head.next.data);
		System.out.println(list.size);
		list.remove(1);
		System.out.println(list.head.next.data);
		System.out.println(list.head.next.next.data);
		System.out.println(list.size);
	}
};

class NodeEntity
{
   public Object data;      //存放数据
   public NodeEntity next ; //存放下个节点
   
   public NodeEntity(Object value){  
       this.data = value;  
   }  
   public NodeEntity()
   {
	   this.data = null ;
	   this.next = null ;
   }
};

class NodeList
{
	public int size ;
	public NodeEntity head ;
	
	public NodeList()
	{
		this.size = 0;
		this.head = new NodeEntity();   ;
	}
	
	public boolean contain(Object data)
	{
		boolean flag = false ;
		NodeEntity next = head.next ;
		while(next!=null)
		{
			if(next.data==data)
			{
				flag = true ;
				break ;
			}
			next = next.next ;
		}
		return flag ;
	}
	
	public boolean add(Object data)
	{
		if(contain(data))
		{
			return false ;
		}
		else
		{
			NodeEntity p = new NodeEntity(data);
			p.next = head.next ;
			head.next = p ;
			this.size++;
			return true ;
		}
	}
	public boolean remove(Object data)
	{
		NodeEntity current = head;  
		NodeEntity previous = head; //记住上一个节点  
		boolean flag = true ;
         while (current.data != data) {  
             if (current.next == null) {  
            	 flag = false;  
            }  
            previous = current;
            current = current.next;
        }
        if(current == head) {
        	 head = head.next;  
        } else {
            previous.next = current.next;  
        }  
        return flag;
	}
};
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    快慢指针法判断单链表有环

    在Java中,判断单链表是否有环的经典方法是使用Floyd的“龟兔赛跑”算法,也称为快慢指针法。这种方法利用两个指针,一个每次走一步(称为慢指针),另一个每次走两步(称为快指针)。如果链表中存在环,那么快指针...

    Java实现单链表以及单链表的操作.zip

    11. **判断单链表是否存在环**: 使用Floyd判环法(也称为龟兔赛跑算法),让两个指针以不同速度移动,如果存在环,它们最终会相遇。 12. **环的长度**: 如果发现链表有环,可以使用快慢指针再次相遇后继续移动...

    双指针法判断链表有环-Java 版

    附件是使用双指针发判断链表有环的代码实现,在Java中,判断单链表是否有环的经典方法是使用Floyd的“龟兔赛跑”算法,也称为快慢指针法。这种方法利用两个指针,一个每次走一步(称为慢指针),另一个每次走两步...

    我的Java单链表练习

    在实际编程中,我们还可能需要其他功能,例如反转链表、合并两个已排序的链表、判断链表是否有环等。这些高级操作需要更复杂的数据结构知识和算法技巧。例如,反转链表可以通过迭代或递归实现,而判断链表是否有环...

    java实现单链表中是否有环的方法详解

    这篇文章主要探讨的是如何判断一个单链表中是否存在环,这是一个重要的算法问题,特别是在数据结构和算法的学习中。 首先,我们需要了解问题的核心:检查链表中是否存在环。一个简单的算法是使用两个指针,我们称为...

    java单链表的基本操作.zip

    8. **判断链表是否有环**: 判断链表是否存在环是一个经典的算法问题,可以使用快慢指针(Floyd判圈法),快指针每次移动两个节点,慢指针每次移动一个节点,如果两者相遇,则链表有环。 9. **链表的排序**: ...

    约瑟夫环的单链表实现

    对于寻找单链表环的入口,具体步骤如下: 1. 初始化两个指针,快指针 `fast` 和慢指针 `slow`,都指向链表头。 2. 当 `fast` 不为 null 并且 `fast.next` 也不为 null 时,执行以下操作: - `fast` 移动两步,`slow...

    基于JAVA的数据结构之单链表操作合

    8. **判断链表是否有环**:链表中可能存在环,即某个节点的next引用指向了链表中的先前节点。可以使用快慢指针(Floyd算法)来检测环,快指针每次移动两个节点,慢指针每次移动一个节点,如果它们相遇,则链表有环。...

    安卓系统以及进阶教程.zip

    面试基础算法题排序快排堆排归并排序M个元素中查找前N个元素链表判断链是否有效判断单链表是否有环并且找到有环的第一个节点反转发一个链表单链表输出倒数第k个元素二叉树二叉树给出根节点和目标节点,查找从根节点...

    带环单链表查找环的入口算法(Java语言描述)

    以上代码定义了一个`Node`类用于表示链表节点,`isCircular()`方法用于判断链表是否有环,而`getEntry()`方法则用于找到环的入口。通过这些方法,我们可以有效地处理带环单链表并找出环的入口。这种方法既节省空间又...

    java实现常见算法

    Java 实现常见算法是一个非常重要的主题,包括判断链表是否为循环链表、找出单链表的中间节点、约瑟环问题、单链表反转、最大子序列和问题、最大公因数、判断两个数组中是否有相同的数字、字符串反转等知识点。

    linkedList:java单链表的实现和简单操作

    linkedListjava单链表的实现和简单操作注意isCircle()这个函数是判断单链表是否成环的函数,由于是单链表所以头尾指针只有一个,所以出现环只能是大圈,最后一个和头结点成环,不可能出现中间“打结”的情况,我们...

    数据结构-单链表的操作

    判断链表是否有环** 检测链表循环(环)的存在,可以使用快慢指针(Floyd算法)。快指针每次移动两个节点,慢指针每次移动一个节点。如果两者相遇,说明存在环;若快指针到达尾部,说明无环。 **10. 复制链表** ...

    单链表的实现

    9. **判断链表是否有环**:可以使用快慢指针,快指针每次移动两步,慢指针每次移动一步,如果它们相遇,则链表有环。 这些是单链表的基本操作和常见问题,理解和掌握它们是学习数据结构和算法的基础。在实际编程中...

    java语言程序设计与数据结构(基础篇)原书第11版 编程题,偶数题目答案

    解题可能需要实现寻找最短路径或判断有向图中是否存在环。 通过解决这些偶数编号的编程题,学习者可以深化对Java语言特性和数据结构的理解,提高编程技巧,并培养解决问题的能力。同时,这也为后续学习更复杂算法和...

    Java面试资料之Java集合框架

    链表环问题是链表中常见的问题之一,涉及到如何判断链表中是否存在环以及如何找到环的入口节点等问题。 - **判断链表是否存在环**:使用“快慢指针”技术,快指针每次移动两步,慢指针每次移动一步。如果两者相遇,...

    数据结构(java版)习题解答

    - **题目**:判断一个数组是否已经按升序排列。 - **解答**:遍历数组,比较相邻元素,确保前一个不大于后一个。 **实验1.3:用递归算法求两个整数的最大公因数** - **题目**:使用递归来求解两个整数的最大公因数...

Global site tag (gtag.js) - Google Analytics