Java实现链表

3、链表

MyLinkedList 有一个头指针,一个尾指针,还有链表长度size

内有两个类,一个是实现了Iterator接口的迭代器类,另一个是Node类,其中Node数据结构中,==除了数据,还要有前一个Node和后一个Node变量。

双向循环链表

代码如下:

import java.util.Iterator;

/**
 * 双向循环链表
 * @author Administrator
 * @date 2022-09-11 22:57
 */
public class MyLinkedList implements Iterable{
    private Node last;   // 尾指针
    private Node first;  // 头指针
    private int size;       // 链表长度 每次插入要 +1

    @Override
    public Iterator iterator() {
        return new MyIter() ;   // 返回一个迭代器
    }

    /**
     * 实现Iterator接口的迭代器类
     */
    class MyIter implements Iterator{
        int index = 0;      // 从0开始遍历
        @Override
        public boolean hasNext() {
            return index != size;  //如果为真 就是还有下一个
        }

        @Override
        public E next() {
            return get(index++);    // 通过get方法得到链表的item值
        }

        @Override
        public void remove() {

        }
    }

    /**
     * 节点类
     * @param
     */

    private static class Node{
        E item;         // 元素值
        Node prev;   // 前一个Node
        Node next;   // 后一个Node
        public Node(Node prev,E item,Node next){
            this.item=item;
            this.prev=prev;
            this.next=next;
        }
    }

    public boolean addLast (E element)
    {
        // 声明一个不变的尾结点
        final Node l = last;
        // 把item装入一个Node里 下面开始插入
        Node newNode = new Node(l,element,null);
        // 先把尾结点指向新插入的结点
        last = newNode;   // 新插进来的就是最后一个
        // 如果是这是第一个元素 那么头尾结点其实都是这个新结点
        if (l == null)
        {
            first = newNode;     // 把这个新结点赋值给头结点
        }else{
            l.next = newNode;   // 如果不是新的 那么就正常指向下一个
        }
        size ++;            // 链表长度 +1
        return true;
    }

    public E set (int index , E element)
    {
        // 先判断index在哪
        Node x = findNode(index);
        E oldValue = x.item;
        x.item = element;
        return oldValue;        // 返回修改前的item值
    }

    /**
     * 找到指定索引上的Node并返回
     * @param index
     * @return
     */
    private Node findNode(int index){
        if(index < (size >> 1) )    // 如果index索引 小于链表总长的一半 那就从前往后找 直到index位置
        {
            Node x = first;
            for(int i = 0 ; i < index; i++){
                x = first.next;
            }
            return x;
        }
        // 如果index索引 大于链表总长的一半 那就从后往前找 直到index位置
        Node x = last;
        for(int i = size-1 ;i > index; i--){
            x = last.prev;
        }
        return x;
    }

    /**
     * 获得值
     * @param index
     * @return
     */
    public E get(int index)
    {

        return findNode(index).item;
    }

    public static void main(String[] args) {
        MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.addLast("aaa1");
        myLinkedList.addLast("aaa2");
        myLinkedList.addLast("aaa3");
        myLinkedList.addLast("aaa4");
        myLinkedList.addLast("aaa5");
        myLinkedList.set(0,"set");
        myLinkedList.forEach (s -> {
            System.out.println(s);
        });

        Iterator myIter = myLinkedList.iterator();
        while (myIter.hasNext()){
            System.out.println(myIter.next());
        }
    }
}

Java实现链表

3.1、forEach

forEach( )方法是java8新增的一个遍历方法,它被定义在 java.lang.Iterable 接口中。

List、Map、Set、Stream等接口都实现了这个方法,所以可以直接使用这些类的实例化对象调用forEach方法遍历元素。

Java实现链表

比如遍历hashMap可以这么写:

 items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));

遍历List可以这么写:

myList.forEach(s -> System.out.println(s));

Original: https://www.cnblogs.com/rainbow-1/p/16690489.html
Author: 靠谱杨
Title: Java实现链表

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611565/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL实现备份案例(2)

    案例1:MySQL8.0实现数据库冷备份和还原 10.0.0.10 — MySQL8.0 #&#x505C;&#x6B62;&#x6570;&a…

    Linux 2023年6月7日
    094
  • Django_渲染详解

    Django_render 模板语法 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码…

    Linux 2023年6月7日
    0118
  • Linux磁盘管理

    一、磁盘管理 Linux 磁盘管理好坏直接关系到整个系统的性能问题。 Linux 磁盘管理常用的三个命令为 df、 du 和 fdisk。 df(英文全称:disk full):列…

    Linux 2023年5月27日
    087
  • 音视频技术入门课- 05 使用FFmpeg与OBS进行直播推流

    做直播推流的前提是要有直播服务器接收直播流,所以需要我们自己建设一个流媒体服务器。 流媒体服务器SRS SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/H…

    Linux 2023年6月7日
    096
  • 一道诡异的考试题

    题目: 给定$a$张黑牌,$b$白牌,甲,乙两人按以下顺序抽牌: 甲抽一张,乙抽一张,然后弃去一张,然后重复以上过程。 先抽到黑牌者胜,求甲和乙获胜的概率$mod 10045358…

    Linux 2023年6月6日
    078
  • 阿里云函数-爱奇艺签到

    简介 是否支持多账号:是消息推送平台:PUSHPLUS 代码 -*- coding: utf8 -*- import requests,random,string,hashlib,…

    Linux 2023年6月7日
    075
  • QString转char *

    故事背景:最近用到阿里云的OSS,里面用到了好多char *,但是我QT里面都是QString,我尝试用QString::fromstdstring(“”)…

    Linux 2023年6月13日
    078
  • nginx配置文件单独创建和管理

    在nginx主配置文件nginx.conf的http模块下引入配置文件夹(注意路径的正确性) 1、nginx主配置文件备份后编辑(nginx配置存放位置:/usr/local/ng…

    Linux 2023年6月6日
    078
  • docker容器编排原来这么丝滑~

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概念介绍: Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Doc…

    Linux 2023年6月14日
    088
  • 学习linux(centos7)记录的笔记

    此随笔用于记录学习《linux鸟哥的私房菜》过程中1.遇到的问题及解决的过程 2.有必要记录的重要内容 3.对应书上操作的记录 开始于2021年6月18号 一个磁盘的分区通过格式化…

    Linux 2023年6月6日
    082
  • 匿名远程启动jenkins的job

    安装jenkins插件Build Authorization Token Root job配置中的构建触发器,勾选触发远程构建,输入要用的令牌,如soul 通过jenkins地址调…

    Linux 2023年6月6日
    0117
  • 软件工程 结构化设计方法 第3篇随笔

    * 调用:模块间的一种关系,模块A为了完成其任务必须依赖其他模块 ​ ——————> Original: https://www.cnblogs.com/shuisanya/…

    Linux 2023年6月7日
    0133
  • 实验

    编写程序实现以下功能 编写程序,打印99乘法表 将一面额为10元倍数的整钱( 输入一行字符,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。 输入输出示例 Input …

    Linux 2023年6月7日
    092
  • LeetCode 726: 原子的数量-栈和Map的结合以及字符串处理 | Number of Atoms-Combination of stack, map and string processing

    Problem Description Give a chemical formula, return the count of each atom. The count afte…

    Linux 2023年6月13日
    088
  • Java基础 | Stream流原理与用法总结

    Stream简化元素计算; 一、接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式;依旧先看核心接口的设计: B…

    Linux 2023年6月13日
    096
  • 安卓开发——WebView+Recyclerview文章详情页,解决高度问题

    安卓开发——WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章…

    Linux 2023年6月8日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球