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)

大家都在看

  • SpringBoot入门 ->(个人学习记录笔记)

    1. 入门 1.1 导入依赖 所有springboot工程都必须继承spring-boot-starter-parent org.springframework.boot spri…

    Linux 2023年6月8日
    072
  • Python 多线程

    import threading import time def userTest(aa,bb): print(aa) time.sleep(3) print(bb) if __n…

    Linux 2023年6月6日
    080
  • LaTeX 数学公式语法

    参考来源: https://blog.csdn.net/anxiaoxi45/article/details/39449445 https://www.cnblogs.com/ya…

    Linux 2023年6月7日
    099
  • Spring中毒太深,离开了Spring,我居然连最基本的接口都不会写了¯_(ツ)_/¯

    前言 众所周知,Java必学的框架其中就是SSM,Spring已经融入了每个开发人员的生活,成为了不可或缺的一份子。 随着 Spring 的崛起以及其功能的完善,现在可能绝大部分项…

    Linux 2023年6月13日
    085
  • Jmeter 使用Json提取请求数据

    使用Json提取器可以提取请求响应数据 Json提取器 位置: 后置处理器-》Json提取器 使用介绍 1,变量名 变量名,其他部分引用方式: ${变量名}若提取多个变量,多个之间…

    Linux 2023年6月8日
    094
  • SSO之CAS

    单点登录SSO ​ 单点登录的主要原理就是在每次登录成功以后生成一个唯一不可重复的令牌 token,我们就简单的用了一个随 机的 UUID 来生成 token。当用户登录成功后用生…

    Linux 2023年6月7日
    079
  • bzoj 1191 特别行动队

    一道不错的斜率优化入门题,传送门:bzoj 1911 题目描述稍微有点不太清楚,先解释一下 将n个士兵分成几个连续的组,每一组的战斗力为f(y),其中:f(x)=ax2+bx+c(…

    Linux 2023年6月6日
    0109
  • Jquery如何使用animation动画效果改变背景色

    一、问题引入 1. jquery的animate动画虽然强大,但是无法使用其进行背景色(background-color)的动画效果变化,因为animate动画效果只能动态改变数值…

    Linux 2023年6月14日
    0219
  • mit 6.824 lab2B,raft日志复制(lab2D中有关于此处大量代码修改找出了很多错误)

    lab2 说明: https://pdos.csail.mit.edu/6.824/labs/lab-raft.html 参考博客: https://zhuanlan.zhihu….

    Linux 2023年6月7日
    092
  • 双绞线

    双绞线简介 双绞线(twisted pair,TP)是一种综合布线工程中最常用的传输介质,双绞线一般由两根22~26号绝缘铜导线相互缠绕而成,在一个电缆套管里的,不同线对具有不同的…

    Linux 2023年6月7日
    085
  • VirtualBox 和宿主机挂载共享文件夹 步骤记录

    问题记录 这个功能不常用(感觉这个步骤很繁琐,用finalshell连ssh就能很溜),但是有时候在公司网络受限的时候安装不了ssh,只能用这个挂载的方式。 防止后期遗忘步骤,我把…

    Linux 2023年6月6日
    0165
  • Git 命令

    创建仓库 git init 命令创建一个新的 Git 仓库。它用来将已存在但还没有版本控制的项目转换成一个 Git 仓库,或者创建一个空的新仓库。大多数Git命令在未初始化的仓库中…

    Linux 2023年6月8日
    0105
  • Java基础 String

    String类 字符串是一个特殊的对象。 字符串一旦初始化就不可以被改变。 String s="abc"; 特点: String构造函数 主要几个String构…

    Linux 2023年6月14日
    0136
  • 《Redis开发与运维》——(五)Redis持久化(脑图)

    posted @2021-01-09 15:04 雪山上的蒲公英 阅读(122 ) 评论() 编辑 / 返回顶部代码 / Original: https://www.cnblogs…

    Linux 2023年5月28日
    095
  • 如何提高团队开发质量

    年轻的时候去面过一个相对于当时我的比较高端的管理岗位,当时的我情况是,开发经验相对丰富, 但管理经验还欠缺。对方当时面临一个具体的问题。 “我们最近生产上,出现了一个比…

    Linux 2023年6月13日
    083
  • docker-compose安装,yml文件配置

    1、离线安装 https://github.com/docker/compose/releases 移动文件 mv docker-compose-linux-x86_64 /usr…

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