当前位置 : 主页 > 编程语言 > java >

从有环链表中如何获得环的长度

来源:互联网 收集:自由互联 发布时间:2022-07-04
节点类 @Data public class Node { /** * 用于保存节点中的数据 */ private Object data ; /** * 用于保存下一个节点的地址值 */ private Node next ; public Node ( Object data ) { this . data = data ; } public Node ( Object

从有环链表中如何获得环的长度_快慢指针

节点类

@Data
public class Node {
/**
* 用于保存节点中的数据
*/
private Object data;
/**
* 用于保存下一个节点的地址值
*/
private Node next;

public Node(Object data) {
this.data = data;
}

public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}

实现类

package day04;

/**
* @Author yqq
* @Date 2022/05/09 09:46
* @Version 1.0
* 从有环链表中,获得环的长度
*/
public class Test06 {
public static void main(String[] args) {
//创建一个单链表
Node lastNode = new Node(55);
Node node4 = new Node(44,lastNode);
Node node3 = new Node(33,node4);
Node node2 = new Node(22,node3);
Node headNode = new Node(11,node2);
lastNode.setNext(node2);
int len = getLen(headNode);
System.out.println(len);
}

/**
* 获得快慢指针相交的节点
* @param headNode
* @return
*/
public static Node meetNode(Node headNode){
//处理headNode为null的情况
if (headNode == null)
return null;
//定义一个快指针,指向headNode,每次向后移动两次
Node fast = headNode;
//定义一个慢指针,指向headNode,每次往后移动一次
Node slow = headNode;
//定义一个循环用于单链表是否有环
while (fast != null && fast.getNext() != null){
//设置快指针和慢指针每次向后移动
fast = fast.getNext().getNext();
slow = slow.getNext();
//如果fast和slow指向同一个节点,则表示单链表有环
if (fast == slow)
return fast;
}
return null;
}

/**
* 获得有环链表环的长度
* @param headNode
* @return
*/
public static int getLen(Node headNode){
//获得快慢指针相交的节点
Node meetNode = meetNode(headNode);
//处理meetNode为null的情况
if (meetNode == null)
return 0;
//定义一个变量保存环中节点的个数
int size = 0;
//从meetNode节点开始,遍历环中节点
//定义一个临时节点,用于辅助遍历单链表
Node tempNode = meetNode;
//定义死一个循环,用于遍历环中的节点
while (true){
//让tempNode指向它的下一个节点
tempNode = tempNode.getNext();
//更新size的值
size++;
//如果tempNode和meetNode指向同一个节点,就停止遍历操作
if (tempNode == meetNode)
break;
}
//返回环中节点的个数
return size;
}
}

从有环链表中如何获得环的长度_数据结构_02


上一篇:SpringCloud Gateway 集 成 Sentinel
下一篇:没有了
网友评论