当前位置: 首页 > article >正文

带哨兵的单向链表(改动版)

代码:

实现的功能:

1.头部添加

2.尾部添加

3.根据指定索引获得元素

4.向指定索引的位置添加元素

5.根据指定索引删除元素


import java.util.Iterator;
import java.util.function.Consumer;

public class SinglyLinkedList1 implements Iterable<Integer> {
    //头节点
    //带哨兵的单向链表
    private Node head = new Node(666, null);
    //节点类  内部类
    private static class Node{//这个类相对独立,与外部类的变量没有关系,所有可以加static,能加则加
        private int value;
        private Node next;
        public Node(int value, Node next)
        {
            this.value=value;
            this.next=next;
        }
    }

    //在头部进行添加元素
    public void addFirst(int value){
        insert(0,value);
    }
    //遍历元素
   public Iterator<Integer> iterator() {
        //匿名内部类 ->带名字
        return new NodeIterator();
    }
    private class NodeIterator implements Iterator<Integer> {
        Node p=head.next;//内部类使用外部类的变量,不能加static

        @Override
        public boolean hasNext() { //判断是否还有下一个元素
            return p!=null;//返回真
        }

        @Override
        public Integer next() {//返回当前元素,并指向下一个元素
            int value=p.value;
            p=p.next;
            return value;
        }
    }
    //找到最后一个元素
    private Node findLast(){
        Node p;
        for(p=head;p.next!=null;p=p.next);
        return p;
    }

    //在尾部添加元素
    public void addLast(int value){
        Node last=findLast();
        last.next=new Node(value, null);
    }

    //获得索引
    private Node findNode(int index){
        int i=-1;
        for(Node p=head;p!=null;p=p.next,i++){
            if(i==index) return p;
        }
        return null;
    }
    //获得指定索引的元素
    public int get(int index){
        Node node=findNode(index);

        if(node==null){
           throw illegal(index);
        }
        return node.value;
    }

    private IllegalArgumentException illegal(int index) {
        throw new IllegalArgumentException(String.format("索引[%d]不存在", index));
    }
    //向索引位置插入
    public void insert(int index,int value){
        Node prev= findNode(index-1);//找到要插入索引的前一个节点
        if(prev==null) {
            throw  illegal(index);
        }
        prev.next = new Node(value, prev.next);
    }

    //删除第一个元素
    public void removeFirst(){
        remove(0);
    }
    //删除某个索引处的元素
    public void remove(int index){
        Node prev=findNode(index-1);
        //超出索引
        if(prev==null)
            throw illegal(index);
        Node remove=prev.next;
        //链表只有一个元素时
        if(remove==null)
            throw illegal(index);
        prev.next=remove.next;
    }
}


http://www.kler.cn/a/371717.html

相关文章:

  • uniapp开发【点击展示弹窗功能】
  • ClickHouse 3节点集群安装
  • 【Mac】Homebrew
  • ssm016基于 Java Web 的校园驿站管理系统(论文+源码)_kaic
  • 嫉妒经济学:揭秘消费行为背后的情绪驱动力
  • Chromium 在WebContents中添加自定义数据c++
  • Zookeeper 理论基础
  • 10.22.2024刷华为OD C题型(三)--for循环例子
  • 使用SpringCloudSleuth和Zipkin进行分布式链路跟踪
  • linux驱动—在自己的总线目录下创建属性文件
  • 微信小程序live-pusher和video同时使用,video播放声音时时大时小
  • qemu-9.1+linux-kernel-6.11+busybox-1.36.1+NFS挂载
  • Java设计模式—观察者模式详解
  • 问题排查思路
  • 记录一次mmpretrain训练数据并转onnx推理
  • 流刷新定位
  • Ubuntu24.04配置samba共享
  • 微服务的雪崩问题
  • 提问GPT
  • 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(三)
  • SpringBoot 下的Excel文件损坏与内容乱码问题
  • Zustand介绍与使用 React状态管理工具
  • Golang的跨平台开发
  • 从零到一:大学新生编程入门攻略与成长指南
  • 【flask-wtf】 表单验证器
  • Spring Boot 集成 Shiro:会话管理、加密与登录次数限制