LinkedList(1):链表介绍和单向链表的实现

news2024/11/27 21:47:26

1 链表介绍

链表的分类:单链表,双链表,循环链表

  • 链表:由链将一个个元素连接,每一个元素我们通常将其称之为Node 节点
  • Node 节点:由两部分组成

        数据值的变量

        Node next 用来存放下一个节点的Node 对象

package com.example.demo;

import java.util.LinkedList;

public class TestLinkedList {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList(); //双向链表
        linkedList.add(11);
        linkedList.add(22);
        linkedList.add(33);
        System.out.println(linkedList);
    }
}

  • 链表和数组的区别

        链表查询慢(因为链表没有索引),但是增删快,

 

2 自定义单向链表

设计接口

目的:为了体系的完整,以及代码的复用,设计出以下结构

需要实现的方法

public int size();
public boolean isEmpty();
public boolean contains(E element);
public void add(E element);
public E get(int index);
public E set(int index,E element);
public void add(int index, E element);
public E remove(int index);
public int indexOf(E element);
public void clear();
public String toStrin();

2.1 List 接口

包含共性的方法

package com.example.demo.dao;

// 将arryList 和LinkedList中共性方法进行抽取->保证体系的完整性
public interface List<E> {
    int size();
    boolean isEmpty();
    boolean contains(E element);
    void add(E element);
    E get(int index);
    E set(int index,E element);
    void add(int index, E element);
    E remove(int index);
    int indexOf(E element);
    void clear();
    String toString();
}

2.2 AbstractList 抽象类

实现共性的方法,实现List

package com.example.demo.abstractclass;

import com.example.demo.dao.List;

public abstract class AbstractList<E> implements List<E> {
    protected int size;

    // 判断当前集合中是否有元素
    public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public void add(E element) {
        add(size,element);
    }
    //indexOf : 去寻找对应的元素,如果找到了返回元素的索引,如果没找到返回一个-1
    public boolean contains(E element) {
        return indexOf(element) != -1 ;
    }

}

2.3 LinkedList实现

顺序:

  • 定义结构
  • get -> node
  • indexOf(E element)
  • set(int index, E element)
  • clear()
  • add
  • remove
  • toString

package com.example.demo.Linked;

import com.example.demo.abstractclass.AbstractList;


public class LinkedList<E> extends AbstractList<E> {

    public Node<E> first;

    private static class Node<E> {
        Node<E> next;
        E element;

        public Node(Node next, E element) {
            this.next = next;
            this.element = element;
        }
    }

    public E get(int index) {
        checkElementIndex(index);
        return node(index).element;
    }

    private void checkElementIndex(int index) {
        if (!isElementIndex(index)) {
            throw new IndexOutOfBoundsException(": Index: " + index + ", Size: " + size);
        }
    }

    private boolean isElementIndex(int index) {
        // 满足条件
        return index >= 0 && index < size;

    }

    private Node<E> node(int index) {
        Node x = first;
        for (int i = 0; i < index; i++) {
            x = x.next;
        }
        return x;
    }


    public E set(int index, E element) {
        // 你在指定索引上去修改元素值是 element  ,原来返回原来的值
        checkElementIndex(index);
        Node<E> node = node(index);
        //记录原来的老值
        E oldElement = node.element;
        //将传入的值进行覆盖
        node.element = element;
        return oldElement;
    }

    public void add(int index, E element) {
        checkPostionIndex(index); // 0   index >= 0
        // 1. 获得 index -1 的Node  同时 还要获得 index 节点  去改变index- 1 上的next ,同时去  将next 节点的内存值 赋值给 新new 出来的Node

        if (index == 0) {
            first = new Node(first, element);

        } else {
            Node<E> pre = node(index - 1);
            Node<E> next = pre.next;
            pre.next = new Node<E>(next, element);
        }
        size++;
    }

    private void checkPostionIndex(int index) {
        if(!isPostionIndex(index)){
            throw new IndexOutOfBoundsException(": Index: " + index + ", Size: " + size);
        }
    }

    private boolean isPostionIndex(int index) {
        return index >= 0 && index <= size;
    }

    public E remove(int index) {
        checkElementIndex(index);
        Node<E> oldNode = first;
        if(index == 0){
            first = first.next;
        }else {
            Node<E> pre = node(index - 1);
            oldNode = pre.next;
            pre.next = oldNode.next;
        }
        return oldNode.element;
    }

    public int indexOf(E element) {
        Node x = first;
        int index = 0;
        if (element == null) {
            for (Node i = x; i != null; i = i.next) {
                if(element == i.element)
                {
                    return index;
                }
                index++;
            }

        } else {
            for (Node i = x; i != null; i = i.next) {
                if( element.equals(i.element)){
                    return index;
                }
                index ++;
            }
        }
        return -1;
    }

    public void clear() {
        size =0;
        first=null;
    }

    public String toString(){

        if(size == 0){
            return  "[]";
        }
        StringBuilder sb = new StringBuilder().append("[");
        Node x = first;
        for(Node i = x; i != null ; i = i.next){
            sb.append(i.element);
            if( i.next == null){
                return sb.append("]").toString();
            }
            sb.append(",");
        }
        return  sb.toString();
    }
}

2.4 测试结果如下

package com.example.demo;


import com.example.demo.Linked.LinkedList;

public class TestLinkedList {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList(); //双向链表
        linkedList.add(11);
        linkedList.add(22);
        linkedList.add(33);
        System.out.println(linkedList);
    }
}

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

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

相关文章

redis zrange 与 zrangebyscore的区别

redis zrange 与 zrangebyscore的区别 目录 redis zrange 与 zrangebyscore的区别前言先说概念上的结论&#xff1a;实验数据准备对比案例一对比结论&#xff1a;对比案例二对比结论&#xff1a; 总结 前言 想做一个在redis中获取数据时分页的功能&#xff0c;从网上查找到了z…

【C/C++数据结构与算法】C语言预处理

目录 一、源文件到可执行程序的过程 二、预处理详解 1. 预定义符号 2. #define 3. 条件编译 一、源文件到可执行程序的过程 预处理&#xff1a;去注释&#xff0c;宏替换&#xff0c;头文件展开&#xff0c;条件编译编译&#xff1a;c语言 ---> 汇编语言&#xff08;语…

软考高级系统架构设计师(二) 基础知识之计算机组成与系统结构

目录 概要 计算机组成结构 CPU组成 冯诺依曼结构 存储系统-层次化存储结构 高速缓冲存储器cache 主存编址计算 磁盘管理 磁盘管理算法 先来先服务&#xff08;FCFS&#xff09;&#xff1a; 最短寻道时间优先&#xff08;SSTF&#xff09; 扫描算法&#xff08;电梯调度…

【VisualStudio】使用 C++ 语言开发 Qt 环境配置教程

文章目录 1. 安装 Visual Studio2. 安装 Qt3. 联合Ref 先上一张效果图&#xff0c;具体步骤主要分为以下三步。 1. 安装 Visual Studio 这一步不再赘述&#xff0c;注意一定要安装 C 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 2. 安装 Qt 这一步也不再赘…

DAY10_HTTPTomcatServlet

目录 1 Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 2 HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示 2.3 响应数据格式2.3.1 格式介绍2.3.2 响应状态码2.3.2.1 状态码大…

vue+element-ui初体验入门拥有自己的前台项目以及配置文件讲解(2)组件式开发,路由,请求发送

阿丹&#xff1a; 前面的文章已经进行了vue的组件安装&#xff0c;本篇文章来了解一下vue的语句语法以及element-ui的具体用法。并使用全局的守卫路由来完成用户完成登录来请求头携带token 导入axios以及导入element-ui 按照图片指引来到main.js将我们前面文章下载的组件进行…

基于matlab将天线工具箱与相控阵系统配合使用(附源码)

一、前言 创建天线阵列&#xff08;如均匀线性阵列 &#xff08;ULA&#xff09;&#xff09;时&#xff0c;可以使用相控阵系统工具箱中内置的天线。或者&#xff0c;您可以使用天线工具箱天线。天线工具箱天线提供物理天线的真实模型。它们是使用力矩的方法设计的。相控阵天线…

自动化测试工具 AirTest 的使用方法与简介

目录 前言&#xff1a; Airtest简介 1.基于图像识别的Airtest框架 2.基于UI识别的Poco框架 Airtest环境搭建 Airtest布局 Airtest使用步骤 第一步&#xff1a;连接移动设备 第二步&#xff1a;创建一个.air文件&#xff08;也就是我们的测试脚本&#xff09; 第三步&#xff1a…

相机去畸变

1. 背景 在做图像感知工作过程中会遇到需要处理相机畸变的情况&#xff0c;如SLAM、3D重建等&#xff0c;则需要了解一些常见相机模型的成像过程&#xff0c;以及依据成像过程实现去除相机成像的畸变。 注意&#xff1a;这篇文章并不涉及太多相机参数畸变原理&#xff0c;更多…

Vicuna模型权重合成及模型部署

第一式&#xff1a;Vicuna模型部署 1.环境搭建1.1 构建虚拟环境1.2 安装FastChat1.2.1 利用pip直接安装1.2.2 从github下载repository然后安装 2.Vicuna Weights合成2.1 下载vicuna delta weights2.2 下载原始llama weights2.3 合成真正的working weights2.3 填坑手册 3. 使用命…

第九章 os模块

1. os模块介绍 os 模块是Python 内置的与操作系统中的文件系统相关的模块&#xff0c;该模块依赖于操作系统。通常情况下&#xff0c;如不特别指出&#xff0c;该模块提供的方法、属性在Windows 和UNIX 系统上都是可用的。其中&#xff0c;UNIX 系统包括Linux 和Mac OS X 说明…

软件加密类型及原理特点总结

目录 一、软件加密目的 二、加密方式介绍 2.1 硬件加密 2.2 软件加密 三、软件加密方式 3.1非对称加密算法 3.2对称加密算法 四、数字签名 五、软件破解方式 参考文献 一、软件加密目的 防止软件被复制使用并恶意破坏&#xff0c;给企业和个人带来经济损失。 二、加密方…

杂记 | 使用Docker和Nginx为网站添加HTTPS访问功能

文章目录 01 准备工作1.1 HTTPS介绍1.2 准备工作 02 编写nginx.conf03 使用docker启动nginx 01 准备工作 1.1 HTTPS介绍 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密通信保护网站数据传输的协议。它是 HTTP 协议的安全版本&#xff0c;通…

ROS下写服务

话题和服务的对比&#xff1a; 1.话题 话题是单向的&#xff0c;而且不需要等待服务端上线&#xff0c;直接发就行&#xff0c;数据的实时性比较高。 频率高&#xff0c;实时性强的传感器数据的传递一般使用话题实现。 话题通信是ROS中使用频率最高的一种通信模式&#xff0c…

人工智能之后,量子计算将成为下一趋势

光子盒研究院 人工智能显然是席卷科技行业的最新热潮&#xff0c;但一个更大的趋势可能即将到来&#xff0c;那就是量子计算——只要它能解决令人不安的网络安全问题。 量子计算的进展似乎注定要使今天的基于电子芯片的超级计算机逊色。这些机器在亚原子水平上工作&#xff0c;…

excel爬虫相关学习1:简单的excel爬虫

目录 1 什么是excel 爬虫 2 EXCEL爬虫 2.1 excel 爬虫的入口 2.2 需要配置的信息 2.2.1 如何获得 ua信息 2.3 获取的信息 2.3.1 获取信息的基本内容 2.3.2 获取过程 2.3.3 我们只用关注“表视图 ” 即可 2.4 EXCEL获得的爬虫数据 加载到excel里 2.5 数据到了excel表后…

解决关于由于找不到vcruntime140_1.dll丢失的解决方法(有效的解决方法)

vcruntime140_1.dll是什么什么文件呢&#xff1f;为什么电脑在运行一些游戏的时候会出现丢失vcruntime140_1.dll&#xff0c;然后游戏运行失败?这个dll文件是电脑重要的运行库文件。丢失了会导致很多程序无法运行。 本教程操作系统&#xff1a;Windows vcruntime140_1.dll丢失…

AN10834-MIFARE ISOIEC 14443 PICC selection.pdf

AN10834-MIFARE ISOIEC 14443 PICC selection.pdf 1简介 在读卡器&#xff08;系统&#xff09;和智能卡之间交换数据之前&#xff0c;必须正确选择智能卡。该卡选择过程&#xff08;卡激活&#xff09;在用于非接触式接近系统的ISO14443-3中进行了描述。非接触式应用的急剧增…

k8s部署成功后却显示结点一直处于NotReady状态解决方案

直接说结论&#xff1a;原因是服务器的/opt/cni/bin/目录中没有flannel插件&#xff0c;安装flannel 到/opt/cni/bin/目录下即可。具体步骤往下看。 [rootK8SMaster ~]# journalctl -f -u kubelet.service 先看下报错&#xff0c;发现我一直显示NotReady的原因是由于 [faile…

windows系统安装显卡驱动软件和CUDA11.1的详细教程

深度学习目标检测框架在进行图像计算时需要GPU进行加速&#xff0c;需要用到硬件GPU显卡&#xff0c;目标检测框架和硬件GPU建立联系需要通过①显卡驱动软件&#xff1b;②CUDA软件依次建立联系。这两个软件&#xff0c;可直接从NVIDIA官网下载&#xff0c;版本没有非常严格的需…