数据结构---链表(java)

news2025/1/16 14:06:21

目录

1. 链表

2. 创建Node

3. 增加

4. 获取元素

5. 删除

6. 遍历链表

7. 查找元素是否存在

8. 链栈的实现

9. 链队的实现 


1. 链表

  • 数据存放在"Node"结点中

优点:不用考虑扩容和缩容的问题,实现了动态存储数据

缺点:没有随机访问的能力

2. 创建Node

先创建一个MyLinkedList类,初始化Node结点内部类

private class Node {
        private T val;
        private Node next;

        public Node() {
            this.val = null;
            this.next = null;
        }

        public Node(T val) {
            this.val = val;
            this.next = null;
        }
    }

3. 增加

<1> 在头部添加

public void addHead(T val) {
        Node node = new Node(val);
        node.next = this.header;
        this.header = node;
        this.size++;
    }

<2> 在尾部添加

public void tail(T val) {
        Node node = new Node(val);
        this.size++;
        if(header.next==null){
            this.header=node;
            return;
        }
        Node cur = header;
        while (cur.next!=null){
            cur = cur.next;
        }
        cur.next=node;
    }

<3> 在任意位置添加

public void add(int index, T val) {
        if (index < 0 || index > this.size) {
            throw new IllegalArgumentException("index is invalid");
        }
        //要插入的结点
        Node node = new Node(val);
        //新建一个虚拟头节点
        Node dummyHead = new Node(null);
        dummyHead.next = header;
        Node pre = dummyHead;
        //找到待插入位置的前一个结点
        for (int i = 0; i < index; i++) {
            pre = pre.next;
        }
        node.next = pre.next;
        pre.next = node;
        //更新头节点
        header = dummyHead.next;
        this.size++;
    }

4. 获取元素

<1> 获取头部元素

public T getHead() {
        if (isEmpty()) {
            return null;
        }
        return header.val;
}

<2> 获取尾部元素

public T getHail() {
        if (isEmpty()) {
            return null;
        }
        Node cur = this.header;
        while (cur.next != null) {
            cur = cur.next;
        }
        return cur.val;
    }

<3> 获取任意节点元素

public T get(int index) {
        if (index < 0 || index > this.size) {
            throw new IllegalArgumentException("index is invalid");
        }
        Node cur = this.header;
        int i = 1;
        while (i <= index) {
            cur = cur.next;
            i++;
        }
        return cur.val;
    }

5. 删除

<1> 通过下标删除结点

public Optional<T> removeByIndex(int index){
        if(index<0||index>=this.size){
            return Optional.empty();
        }
        //判断是否是头结点
        //使用虚拟头节点
        Node dummyNode = new Node(null);
        dummyNode.next = header;
        Node pre = dummyNode;
        int i=1;
        //寻找要删除的结点
        while(i<=index){
            pre = pre.next;
            i++;
        }
        //改变指针指向
        Node delNode = pre.next;
        pre.next = delNode.next;
        delNode.next = null;
        this.size--;
        this.header = dummyNode.next;
        return Optional.of(delNode.val);
    }

<2> 通过值删除结点

public void removeByVal(T val){
        if(isEmpty()){
            return;
        }
        Node dummyNode = new Node(null);
        dummyNode.next = header;
        Node pre = dummyNode;
        while(pre.next!=null){
            Node cur = pre.next;
            if(cur.val.equals(val)){
                pre.next=cur.next;
                cur.next=null;
                size--;
            }else {
                pre = pre.next;
            }
        }
        header = dummyNode.next;
    }

<3> 不使用虚拟头结点删除元素

public void removeWithoutDummyHead(T val){
        while(this.header!=null&&this.header.val.equals(val)){
            this.header = this.header.next;
            this.size--;
        }
        if(this.header==null){
            return;
        }
        //此时头节点一定不是要删除的结点
        Node pre = this.header;
        while(pre.next!=null){
            if(pre.next.val.equals(val)){
                pre.next = pre.next.next;
                this.size--;
            }else{
                pre = pre.next;
            }
        }
}

6. 遍历链表

重写toString()方法,将他拼接成链表的样子

@Override
    public String toString() {
        //创建一个临时结点
        Node cru = header;
        StringBuffer sb = new StringBuffer();
        while (cru != null) {
            sb.append(cru.val + "--->");
            cru = cru.next;
        }
        sb.append("Null");
        return sb.toString();
    }

7. 查找元素是否存在

public boolean contains(T val) {
        Node res = new Node(val);
        Node cur = header;
        for (int i = 0; i < this.size; i++) {
            if (res.val.equals(cur.val)) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

8. 链栈的实现

public interface Stack<T> {
    void push(T element);
    T pop();
    int getSize();
    boolean isEmpty();
    T peek();
}
public class LinkedStack<T> implements Stack<T> {

    private MyLinkedList<T> data;

    public LinkedStack(MyLinkedList<T> data) {
        this.data = data;
    }

    @Override
    public void push(T element) {
        this.data.addTail(element);
    }

    @Override
    public T pop() {
        Optional<T> optional = this.data.removeByIndex(0);
        if(optional.isPresent()){
            return optional.get();
        }
        return null;
    }

    @Override
    public int getSize() {
        return this.data.getSize();
    }

    @Override
    public boolean isEmpty() {
        return this.data.isEmpty();
    }

    @Override
    public T peek() {
        return this.data.getHead();
    }
}

9. 链队的实现 

public interface Queue<T>{
    void offer(T ele);
    T poll();
    boolean isEmpty();
    int getSize();
    T getFront();
}
public class LinkedQueue implements Queue {
    private MyLinkedList data;

    public LinkedQueue(MyLinkedList myLinkedList) {
        this.data = myLinkedList;
    }

    @Override
    public void offer(Object ele) {
        this.data.addTail(ele);
    }

    @Override
    public Object poll() {
        return this.data.removeByIndex(0);
    }

    @Override
    public boolean isEmpty() {
        return this.data.isEmpty();
    }

    @Override
    public int getSize() {
        return this.data.getSize();
    }

    @Override
    public Object getFront() {
        return this.data.getHead();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLAlchemy Oracle Database 23c Free 集成之旅

SQLAlchemy & Oracle Database 23c Free 集成之旅 1. SQLAlchemy 是什么2. Oracle Database 23c Free 是什么3. 运行 Oracle Database 23c Free4. 学习 SQLAlchemy 统一教程4-1. 安装依赖库4-2. 建立连接 - 引擎4-3. 使用事务和 DBAPI4-3-1. 获取连接4-3-2. 提交更改4-3-3.…

git git fetch 和 git fetch origin master 的区别

git fetch 第1步 先读取 .git/config 配置 [remote origin]&#xff0c;若 fetch 并没有指定其中一个或多个远程仓库&#xff0c;就会处理所有的远程仓库 [remote “origin”]url gitgithub.com:kaku/testGit.gitfetch refs/heads/:refs/remotes/origin/第2步 git fetch 会…

Python 字符串的常用方法

视频版教程 Python3零基础7天入门实战视频教程 下标索引操作和前面的列表&#xff0c;元组用法一样。 虽然字符串不能被修改&#xff0c;但是返回一个操作过的新字符串&#xff0c;所以方法还不少。 我先学习下常用方法&#xff1b; 1&#xff0c;index(元素)方法&#xff0…

第三篇------Virtual I/O Device (VIRTIO) Version 1.1

上一篇文章链接https://blog.csdn.net/Phoenix_zxk/article/details/132921821 接下来续上 5.9.4 支持的加密服务 以下加密服务已定义&#xff1a; /* CIPHER 服务&#xff1a;用于加密解密操作 */ #define VIRTIO_CRYPTO_SERVICE_CIPHER 0 /* HASH 服务&#xff1a;用于哈…

【微信小程序】网络请求

环境&#xff1a;微信小程序开发工具 测试api&#xff08;随机获取猫咪靓照&#xff09;:https://api.thecatapi.com/v1/images/search?limit2 示例&#xff1a; 完整代码 request.wxml <button bind:tap"requestBtn" type"primary">网络请求&l…

基于SSM+Vue的校园活动管理平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【python之经验模态分解EMD实现】PyEMD库的安装和导入EMD, Visualisation问题解决方法[完整可运行]

现有的导入问题 目前网上的办法&#xff0c;直接导入&#xff1a;from PyEMD import EMD, Visualisation 是有问题的 可能会出现 在 ‘init.py | init.py’ 中找不到引用 ‘Visualisation’ 的报错。 原因似乎是现在导入的命令改了&#xff0c;这是一个坑&#xff0c;解决的…

数组相关面试题

1、原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N),空间复杂度为O(1)。 OJ链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 分析&#xff1a; 法1&#xff1a;挪到数据&#xff0c;思路如顺序表的头删&#xff0c;将后面的数据向前挪动将…

What does rail-to-rail mean (Rail-to-Rail Op amp) ?

What does rail-to-rail mean (Rail-to-Rail Op amp) ?

网络安全进阶学习第十九课——CTF之密码学

文章目录 一、密码学简介二、密码设计的根本目标三、古典密码1、摩斯密码CTF-题目展示 2、换位密码1&#xff09;栅栏密码2&#xff09;凯撒密码3&#xff09;曲路密码4&#xff09;列移位密码 3、替换密码1&#xff09;移位密码2&#xff09;简单替换密码3&#xff09;埃特巴什…

10 Ubuntu下配置STMCubeMX与CLion IDE联合环境搭建(不包含下载CLion的教程)

序言 果然作为一名测控系的学生&#xff0c;纯搞视觉多少还是有点与专业脱节&#xff0c;决定入坑嵌入式。选择STM32进行入门&#xff0c;并且使用CubeMX加CLion作为我的第一个真正意义上的嵌入式开发环境&#xff08;大一的时候玩过一段时间&#xff0c;但是没什么技术&#…

java创建excel文件和解析excel文件

创建excel文件 package com.bjpowernode.crm.poi;import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.HorizontalAlignment;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.…

用于3D模具和模型制作:数控机床进行加工软件DeskProto【常用CAM(计算机辅助制造)软件】

DeskProto是一款用于计算机数控&#xff08;CNC&#xff09;机床的三维模型加工的软件&#xff0c;它的技术原理和操作方法涵盖了以下方面&#xff1a; 技术原理&#xff1a; DeskProto的技术原理基于计算机辅助设计&#xff08;CAD&#xff09;和计算机数控&#xff08;CNC&…

Day43:VUEX

1. 基本介绍 这里介绍的VueX是匹配Vue3的V4版本&#xff0c;它绝大多数功能使用都和之前基本保持一致。 1.1 官方定义 先一起看一下官网对于VueX的定义&#xff1a; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&…

Mybatis入门与数据库连接池以及lombok插件

我们做为后端程序开发人员&#xff0c;通常会使用Java程序来完成对数据库的操作。Java程序操作数据库&#xff0c;现在主流的方式是&#xff1a;Mybatis。 什么是MyBatis? MyBatis是一款优秀的 持久层 框架&#xff0c;用于简化JDBC的开发。 MyBatis本是 Apache的一个开源项…

typescrip接口 interface详解,以及ts实现多态

ts 接口 当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的 示例如下 当一个对象类型被多次使用时,可以看到,很明显代码有大量的冗余 let personTom: { name: string, age?: number, sayHi(name: string): void } {name: Tom,sayHi(n…

从头开始制作扩散模型(实现快速扩散模型的简单方法)

一、说明 本文是关于自己从头开始构建扩散模型的教程。我总是喜欢让事情变得简单易行&#xff0c;所以在这里&#xff0c;我们避免了复杂的数学。这不是一个正常的扩散模型。相反&#xff0c;我称之为快速扩散模型。将仅使用卷积神经网络&#xff08;CNN&#xff09;来制作扩散…

LwIP介绍

文章目录 一、LwIP简介二、LwIP主要特性:三、文件说明lwip-2.1.3contrib-2.1.0一、LwIP简介 lwIP(Light weight IP)是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP 的设…

【Obsidian】中编辑模式和阅读模式光标乱跳问题以及编辑模式中段落聚集的问题解决

前言 最近用Obsidian 软件写md笔记&#xff0c;但是当我分别使用编辑模式和阅读模式时出现了光标乱跳的问题。比如我在编辑模式&#xff0c;光标停留在第500行&#xff0c;但是切换成编辑模式就变成了1000行。而且光标根本没停在原来的位置。这样重新定位非常麻烦。 两种阅读…

mybati缓存了解

title: “mybati缓存了解” createTime: 2021-12-08T12:19:5708:00 updateTime: 2021-12-08T12:19:5708:00 draft: false author: “ggball” tags: [“mybatis”] categories: [“java”] description: “mybati缓存了解” mybatis的缓存 首先来看下mybatis对缓存的规范&…