java 环形链表的示例

一、简介

  环形链表是解决像约瑟夫环问题的类似问题的求解。这里并不讨论约瑟夫环问题,而是讨论环形链表的构建。环形链表由于头节点有数据域,并且又不是双向的,所以头节点需要单独处理。

  对链表的编写,重点要测试头节点和尾节点的增删改查的操作是否正常,往往出问题的地方就在这两个节点上!!

  二、环形链表的代码示例:

/**
  * 包名: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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰雪青松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值