java怎么循环查找_如何用JAVA程序来查找链接列表是否包含循环

查找链表是否包含循环的算法

迭代链表时使用快速和慢速两个指针。快速指针在每次迭代中移动两个节点,而慢速指针移动到一个节点。如果链表包含循环或循环,那么在迭代过程中,快指针和慢指针都会在某个点上相遇。如果它们不相交,并且快速或慢速将指向空,那么链表就不是循环的,它不包含任何循环。这是精确的算法

使用快速和慢速两个指针

每次迭代快速移动两个节点,慢速移动一个节点

如果快速和慢速相遇,则链表包含循环

如果fast指向空或fast.next指向空,则链表不是循环的。

下一部分包含Java程序来检查链表是否包含循环,这是上述算法的精确实现。该算法也被称为Floyd的循环查找算法,通常被称为Tortoise and Hare算法,用于查找链表中的循环。

Java程序检查链表是否为循环

这个Java程序使用LinkedList(不Java.UTI.LIKEDLIST)和链表的前一个节点类,修改了添加ToStTrn()方法和AppEntoTead()方法。另外,链表的iscyclic()方法用于实现逻辑,以确定链表是否包含循环。随后is cyclic()如果链表是循环的,则返回true,否则返回false。

/*

* Java class to represent linked list data structure.

*/

public class LinkedList {

private Node head;

public LinkedList() { this.head = new Node("head"); }

public Node head() { return head;}

public void appendIntoTail(Node node) {

Node current = head;

//find last element of LinkedList i.e. tail

while(current.next() != null){

current = current.next();

}

//appending new node to tail in LinkedList

current.setNext(node);

}

/*

* If singly LinkedList contains Cycle then following would be true

* 1) slow and fast will point to same node i.e. they meet

* On the other hand if fast will point to null or next node of

* fast will point to null then LinkedList does not contains cycle.

*/

public boolean isCyclic(){

Node fast = head;

Node slow = head;

while(fast!= null && fast.next != null){

fast = fast.next.next;

slow = slow.next;

//if fast and slow pointers are meeting then LinkedList is cyclic

if(fast == slow ){

return true;

}

}

return false;

}

@Override

public String toString(){

StringBuilder sb = new StringBuilder();

Node current = head.next();

while(current != null){

sb.append(current).append("-->");

current = current.next();

}

sb.delete(sb.length() - 3, sb.length()); // to remove --> from last node

return sb.toString();

}

public static class Node {

private Node next;

private String data;

public Node(String data) {

this.data = data;

}

public String data() { return data; }

public void setData(String data) { this.data = data;}

public Node next() { return next; }

public void setNext(Node next) { this.next = next; }

@Override

public String toString() {

return this.data;

}

}

}

测试循环的链表

在本节中,我们将使用带有两个链表的Java main方法测试,一个包含循环而另一个不循环。 您甚至可以为isCyclic()方法编写JUnit测试用例,以测试不同位置的循环的不同链表。 这是链表不包含任何循环的第一个测试。

/**

*

* Java program to find if LinkedList contains loop or cycle or not.

* This example uses two pointer approach to detect cycle in linked list.

* Fast pointer moves two node at a time while slow pointer moves one node.

* If linked list contains any cycle or loop then both pointer will meet some time.

*

* @author Javin Paul

*/

public class LinkedListTest {

public static void main(String args[]) {

//creating LinkedList with 5 elements including head

LinkedList linkedList = new LinkedList();

linkedList.appendIntoTail(new LinkedList.Node("101"));

linkedList.appendIntoTail(new LinkedList.Node("201"));

linkedList.appendIntoTail(new LinkedList.Node("301"));

linkedList.appendIntoTail(new LinkedList.Node("401"));

System.out.println("Linked List : " + linkedList);

if(linkedList.isCyclic()){

System.out.println("Linked List is cyclic as it contains cycles or loop");

}else{

System.out.println("LinkedList is not cyclic, no loop or cycle found");

}

}

}

Output:

Linked List : 101-->201-->301-->401

LinkedList is not cyclic, no loop or cycle found

现在让我们改变链表,使其包含循环

//creating LinkedList with 5 elements including head

LinkedList linkedList = new LinkedList();

linkedList.appendIntoTail(new LinkedList.Node("101"));

LinkedList.Node cycle = new LinkedList.Node("201");

linkedList.appendIntoTail(cycle);

linkedList.appendIntoTail(new LinkedList.Node("301"));

linkedList.appendIntoTail(new LinkedList.Node("401"));

linkedList.appendIntoTail(cycle);

//don't call toString method in case of cyclic linked list, it will throw OutOfMemoryError

//System.out.println("Linked List : " + linkedList);

if(linkedList.isCyclic()){

System.out.println("Linked List is cyclic as it contains cycles or loop");

}else{

System.out.println("LinkedList is not cyclic, no loop or cycle found");

}

Output:

Linked List is cyclic as it contains cycles or loop

欢迎大家加入粉丝群:963944895,群内免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思维导图

写在最后:

既然看到这里了,觉得笔者写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值