一、简介
环形链表是解决像约瑟夫环问题的类似问题的求解。这里并不讨论约瑟夫环问题,而是讨论环形链表的构建。环形链表由于头节点有数据域,并且又不是双向的,所以头节点需要单独处理。
对链表的编写,重点要测试头节点和尾节点的增删改查的操作是否正常,往往出问题的地方就在这两个节点上!!
二、环形链表的代码示例:
/**
* 包名:linkedlist
* 文件名:CircleLinkedListDemo.java
*
* 功能:环形链表数据结构的增删改查操作,
*
* 作者:冰雪青松
* 邮箱:946585434@qq.com
* 日期:2022.10.15夜
*
**/
package linkedlist;
import java.util.*;
/**
* 一、主类,即入口类
*
* 说明:对环形链表数据结构的操作,是次要的类
*
**/
public class CircleLinkedListDemo {
public static void main(String[] args) {
CircleLinkedList circleLinkedList = new CircleLinkedList();
int i = 0, n = 0;
// ########## [ 对环形链表的增删改查的操作 ]######################
// ------------------------------------------------------------------------------------------------------------------------------
// 1.遍历二维数组添加数据进环形链表 begin
// 建立数据的二维数组
String[][] nameArr = {
{"宋江", "卢俊义", "吴用", "林冲", "公孙胜", "关胜", "秦明", "柴进", "呼延灼", "花荣", "李应", "朱仝"},
{"及时雨", "玉麒麟", "智多星", "豹子头", "入云龙", "大刀", "霹雳火", "小旋风", "双鞭", "小李广", "扑天雕", "美髯公"}
};
// 编号,排序时 noArr 中的最小数不能重复。
int[] noArr = {7, 2, 3, 4, 5, 6, 1, 8, 9, 10, 1, 3};
//true 不排序;false 排序
boolean tag = false;
//遍历二维数组添加节点进链表
if(tag){
//按输入顺序进链表
for(i = 0; i < nameArr[0].length; i++){
circleLinkedList.add(new CHeroNode(noArr[i] , nameArr[0][i], nameArr[1][i]));
}
}else{
// begin ---------------------------------------------------------------------
/**
* 环形链表的排序要求:环形链表的 first 节点必须是编号内的唯一最小值。
*
* 说明:此环形链表由于是用单向链表构成的,无法对第一个节
* 点进行识别和排序,所以用下面程序单独对最小编号进
* 行识别和初始化装载入环形链表的第一个节点。单链表
* 能够排序,是因为头节点的数据域人为设定为空,其它
* 数据可以从头节点后面插入。
*
* 此段代码并没有复用(高聚合,低耦合),因此无需封装。
*
* 注:以下程序的关键点是寻找 noArr 数组中最小值的 sub 下标
* 的位置,才能对二维数组 nameArr 进行相应操作。
**/
int val = noArr[0]; // val 在下面的循环程序执行完后,得到的最小编号。
int sub = 0; // 最小编号在 noArr 数组下标的位置。subscript
int total = 0; // 最小编号是否有重复,大于1判定重复。
//查找最小编号
for (i = 0; i < noArr.length - 1 ; i++) {
if(val > noArr[i + 1]){
val = noArr[i + 1];
sub = i + 1;
}
}
//检查最小编号是否有重复值?
for(i = 0; i < noArr.length - 1; i++){
if(val == noArr[i + 1])
//检查最小编号是否有重复值,有则计数。
total++;
}
//最小编号有重复值,给出提示。
if(total > 1)
System.out.println("⚠️编号为" + val + "的数据已经存在!");
// 数组中编号最小的元素首先进链表
circleLinkedList.addByOrder(new CHeroNode(noArr[sub], nameArr[0][sub], nameArr[1][sub]));
// end. ------------------------------------------------------------------------
//按排序进链表
for(i = 0; i < nameArr[0].length; i++){
//如果是最小编号,禁止写入,因为上面的程序已经写入了
if(noArr[i] != val)
circleLinkedList.addByOrder(ne