《大话数据结构》----线性表-----链式存储结构(循环链表)实现--java

本文深入讲解循环链表的实现原理,包括如何通过修改单链表的指针使其形成闭环,以及在尾插法和头插法中实现循环链表的具体步骤。同时,探讨了循环链表在插入和删除操作上的特殊考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

循环链表

将单链表中的终端节点的指针端由空指针改为指向头结点,就使得整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表

实现注意点

  1. 在单链表的基础上,修改最后的指向改为头结点,
    1.1 即a.next=b
    1.2 next=c.next
    1.3 …
    1.4 n.next=a
  2. 循环判断,原来判断是n.next==null表示尾节点, 改为n.next ! = a

实现

链式存储结构(单链表)实现 的基础上,其实只要稍作修改即可

  1. 尾插法初始化更新,重点在最后一句p.nextNode=null改为p.nextNode=rootNode;
//  String data = "31,21,17,16";
 public void lastInit(String[] data){
        //头节点空数据
        rootNode.data = null;
        Node p = rootNode;
        for (String datum : data) {
            Node n = new Node();
            n.data = Integer.parseInt(datum);
            p.nextNode=n;
            p=n;
        }
        //循环链表
        p.nextNode=rootNode;
    }

因为是尾插法,所以数据按照顺序31.21.17.16,重点在最后一个16节点指向了data为null的头结点
尾插法方式
2. 头插法初始化更新,重点在第二句rootNode.nextNode=null;改为rootNode.nextNode=rootNode;

//   String data = "31,21,17,16";
 public void headInit(String [] data){
        rootNode.data = null;
        rootNode.nextNode=rootNode;
        for (String datum : data) {
            Node n = new Node();
            n.data = Integer.parseInt(datum);
            n.nextNode = rootNode.nextNode;
            rootNode.nextNode = n;
        }
    }

头插法,第一个的31依次被插队,故顺序为倒序,即16,17,21,31.** 重点在31节点始终指向第一个节点** ,初始化就是,一直被"插队",好可怜
头插法效果

  1. 输出循环判断p.nextNode!= null改为p.nextNode!= rootNode
 public void out(String str){
        System.out.print(str+" ");
        Node p = rootNode;
        while ( p.nextNode!= rootNode) {
            System.out.print (p.nextNode.data+",");
            p = p.nextNode;
        }
        System.out.println();
    }

  1. 其他

插入和删除则不用管也行,因为有k限制,不会导致死循环,当然最好还是改一点,

 while (p.nextNode!=null&&k < index) 
 //改为
 while (p.nextNode!=rootNode&&k < index) {

收获

一开始比较懵,细细品读文章和两个关键点,即可稍微修改实现.在单链表基础上实现并没有那么复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值