数据结构-列表LinkedList

一,链表的简单的认识.

    数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组.

为什么要学习链表?

   1,链表时最简单的动态数据结构

   2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie.

   3,学习链表有助于更深入的理解引用和递归,

1,链表

2,创建Node

二,链表的方法

1,对链表添加操作

 (1)链表头添加元素

(2)链表中间添加元素

关键点:找到要待添加位置的前一个结点
(3)向链表尾部添加元素

添加完成后

总结:

1,先创建节点node

2,找到最后一个节点pre

3,pre.next=node

2,使用虚拟头结点(解决在头部添加结点的特殊处理)

(注意:添加完成之后需要更新头节点)

3,链表的遍历,查询和更新操作

addHead() 向头部添加节点

addTail()  向尾部添加节点

add() 添加节点,默认头结点

get(index) 获取指定位置的节点

getFirst() 获取头节点

getLast() 获取尾节点

getSize() 获取索引

isEmpty() 判断链表是否为空

contains(val) 判断链表是否存在给定节点

toString() 遍历链表

4,从链表中删除元素

5,链表的时间复杂度分析

(1) 添加元素
(2) 删除操作
(4)修改操作
(5)查找操作

三,用代码实现链表

(需要注意的是用内部类,解决链表的数据类型(节点--Node))

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;/*** 链表:真正的动态数据结构*/
public class LinkedList<T> {// 定义结点private class Node {T val; // 结点的值Node next; // 表示下一个结点public Node(T val) {this.val = val;}public Node(T val, Node next) {this.val = val;this.next = next;}}// 链表的头结点private Node header;private int size;// 构造链表public LinkedList() {this.header = null;this.size = 0;}// 判断链表是否为空public boolean isEmpty() {return this.size == 0;}// 获取链表中元素的个数public int getSize() {return this.size;}// 向链表中添加元素/*** 在链表的头部添加*/public void addHeader(T val) {add(0, val);}/*** 在链表的尾部添加*/public void addTail(T val) {add(this.size, val);}// 在任意位置添加/*public void add(int index, T val) {if (index < 0 || index > this.size) {throw new IllegalArgumentException("index is invalid!");}// 1、创建结点Node node = new Node(val);// 特殊处理:头结点,为啥?头结点没有前驱if (index == 0) {this.header = node;this.size++;return;}// 2、找到插入位置的前驱preNode pre = this.header;int count = 1;while (count < index) {pre = pre.next;count++;}// 3、改变索引的指向node.next = pre.next;pre.next = node;// 4、更新sizethis.size++;}*/public void add(int index, T val) {if (index < 0 || index > this.size) {throw new IllegalArgumentException("index is invalid!");}// 0、创建结点,作为头结点的前驱Node dummyHead = new Node(null);dummyHead.next = this.header;// 1、创建结点Node node = new Node(val);// 2、找前驱结点Node pre = dummyHead;int count = 1;while (count <= index) {pre = pre.next;count++;}// 3、改变索引的指向node.next = pre.next;pre.next = node;// 4、更新sizethis.size++;// 5、更新头结点this.header = dummyHead.next;}@Overridepublic String toString() {List<String> result = new ArrayList<>();// 遍历链表Node cur = this.header;while (cur != null) {result.add(cur.val.toString() + "----->");cur = cur.next;}return result.stream().collect(Collectors.joining());}public static void main(String[] args) {LinkedList<Integer> linkedList = new LinkedList<>();for (int i = 1; i <= 10; i++) {Random random = new Random();int val = random.nextInt(1000) + 1;System.out.println(val);linkedList.addHeader(val);System.out.println(linkedList);}linkedList.add(10,249);System.out.println(linkedList);}
}

四,使用链表实现队列

基本掌握链表的功能,就可以尝试着用链表实现栈或者队列,我们之前用的底层数据类型时数组.

// 定义节点类
class Node {int data;Node next;public Node(int data) {this.data = data;this.next = null;}
}// 定义栈类
class Stack {private Node top;public Stack() {this.top = null;}public void push(int data) {Node newNode = new Node(data);if (top == null) {top = newNode;} else {newNode.next = top;top = newNode;}}public int pop() {if (top == null) {throw new EmptyStackException();} else {int data = top.data;top = top.next;return data;}}
}// 定义队列类
class Queue {private Node front;private Node rear;public Queue() {this.front = null;this.rear = null;}public void enqueue(int data) {Node newNode = new Node(data);if (rear == null) {front = newNode;rear = newNode;} else {rear.next = newNode;rear = newNode;}}public int dequeue() {if (front == null) {throw new NoSuchElementException();} else {int data = front.data;front = front.next;if (front == null) {rear = null;}return data;}}
}

上面代码演示了如何用链表实现栈和队列,分别通过Stack类和Queue类来实现。可以根据自己的需要进一步扩展这两个类的功能,以满足具体的需求。

五,链表的用处

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

  1. 动态内存分配:链表允许在运行时动态地分配和释放内存,相比数组,不需要提前指定数据容量。

  2. 插入和删除节点:链表的插入和删除操作非常高效,只需要修改节点的指针即可,不需要移动其他元素。

  3. 不连续存储:链表的节点可以在内存中的任意位置,它们通过指针进行连接,可以灵活地利用内存空间。

  4. 可变长度:链表的长度可以根据需要进行动态调整,可以方便地增加或减少节点。

  5. 实现其他数据结构:链表可以作为其他数据结构的基础,例如栈、队列、哈希表等。

需要注意的是,链表在访问节点时需要遍历整个链表,因此随机访问效率较低,不适合频繁的随机访问操作。同时,链表需要额外的空间存储指针,因此相比数组会有一定的空间开销。根据具体问题的需求和场景,选择合适的数据结构非常重要。

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

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

相关文章

【深度学习笔记】卷积神经网络——多输入多输出通道

多输入多输出通道 虽然我们在subsec_why-conv-channels中描述了构成每个图像的多个通道和多层卷积层。例如彩色图像具有标准的RGB通道来代表红、绿和蓝。 但是到目前为止&#xff0c;我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二…

EasyRecovery2024电脑版软件评测与使用教程

一、EasyRecovery电脑版软件评测 EasyRecovery电脑版是一款功能强大、操作简便的数据恢复软件。它适用于多种场景&#xff0c;无论是误删除、格式化、分区丢失还是硬件故障&#xff0c;都能提供有效的恢复方案。该软件界面直观&#xff0c;即便没有技术背景的用户也能轻松完成…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中&#xff0c;我们将使用 React 和 MUI&#xff08;Material-UI&#xff09;库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据&#xff0c;并允许用户选择多个节点。 前提 在开始之前&#xff0c;确保你已经安装了以下依赖&#xff1a; Reac…

GEE入门篇|遥感专业术语(实践操作3):时间分辨率(Temporal Resolution)

目录 时间分辨率&#xff08;Temporal Resolution&#xff09; 1.Landsat 2.Sentinel-2 时间分辨率&#xff08;Temporal Resolution&#xff09; 时间分辨率是指特定传感器图像流的重访时间或时间节奏&#xff0c;重访时间是指卫星连续访问地球表面同一位置…

公众号平台迁移公证怎么操作?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;公众号账号迁移的作用可不止是变更主体哦&#xff01;还可以把多个公众号的粉丝、文章合并起来&#xff0c;打造一个超级大 V&#xff1b;还可以变更公众号主体、名称、类型&#xff0c;增加留言功能&#xff1b;个…

javascript监听浏览器离开、进入行为

document.addEventListener(visibilitychange, () > {if (document.visibilityState hidden) {alert(离开)}if (document.visibilityState visible) {alert(进入)}}) visibilitychange是浏览器新添加的一个事件&#xff0c;当其选项卡的内容变得可见或被隐藏时&#xff0…

PyPDF2:项目实战源码分享(PDF裁剪)

目录&#x1f4d1; 1. 背景&#x1f4d1;2. 源码模块解析&#x1f4d1;2.1 读取PDF页数2.2 获取指定页的宽高尺寸2.3 裁剪单页PDF2.4 批量裁剪PDF 总结&#x1f4d1; 1. 背景&#x1f4d1; 接PyPDF2模块推荐博文中提到的实际需求&#xff08;将银行网站下载来的多页且单页多张…

10s了解 共享动画

1. 目的&#xff1a; 界面切换&#xff0c;两控件变化关联&#xff0c;看起来更丝滑流程 2.怎么配置 为关联两控件加上相同transitionName 3.在Navigation开启共享动画 跳转到的界面 接收共享动画 4.在Activity中开启共享动画 同3 &#xff0c;在共享动画两个View加上相同的t…

政安晨【示例演绎虚拟世界开发】(一):Cocos Creator 的 Hello World

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: AI虚拟世界大讲堂 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正。 前言 Cocos Creator是一款非常强大的游戏开发引擎&#xff0c;它有着优秀…

[HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

centos7部署单机项目和自启动

centos7部署单机项目和服务器自启动 1.安装jdk和tomact1.1上传jdk、tomcat安装包1.2解压两个工具包1.3.配置并且测试jdk安装1.4.启动tomcat1.5.防火墙设置1.6配置tomcat自启动 2.安装mysql2.1卸载mariadb&#xff0c;否则安装MySql会出现冲突(先查看后删除再查看)2.2在线下载My…

Linux学习笔记9——adduser,passwd用户创建

Linux是一个多用户的操作系统&#xff0c;允许多用户访问&#xff0c;对系统进行一些操作&#xff0c;其中根用户为root拥有系统一切权限 其中&#xff0c;useradd是新建用户&#xff0c;passwd是给新建用户添加密码&#xff0c;su新建用户名&#xff0c;是切换到该用户对系统进…

雪地奔驰高级版/SnowRunner【带修改器】(全DLCs)

包含DLC • SnowRunner – Sabertooth Livery • SnowRunner – Navistar 5000-MV Tractor • SnowRunner – High Roller Pack • SnowRunner – Loaded Dice Vinyl Wrap • SnowRunner – Scorched Vinyl Wrap • SnowRunner – True Colors Vinyl Wrap • SnowRunner…

企业网站建设需要多少钱?定制开发费用报价在3000-4000元

建立一个网站需要多少钱&#xff1f; 网站建设的价格划分也有很多。 这里首先要提的是市面上常见的一种低成本建站方式——模板网站&#xff0c;就是那种直接制作网站原型就可以无限复制的网站。 或者可以在几分钟内建立一个由软件生成的网站。 成本低得惊人&#xff0c;从500元…

【Java程序设计】【C00300】基于Springboot的足球社区管理系统(有论文)

基于Springboot的足球社区管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的足球社区管理系统&#xff0c;本系统有管理员以及教练角色权限&#xff1b; 管理员设置的功能有&#xff1a;添加并管理各种类型…

nacos注册中心之服务注册

微服务是一种经过良好架构设计的分布式架构方案&#xff0c;特征&#xff1a; 1、单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复业务开发。 2、面向服务&#xff1a;微服务对外暴露业务接口…

常用芯片学习——YC688语音芯片

YC688 广州语创公司语音芯片 使用说明 YC688是一款工业级的MP3语音芯片 &#xff0c;完美的集成了MP3、WAV的硬解码。支持SPI-Flash、TF卡、U盘三种存储设备。可通过电脑直接更新SPI-Flash的内容&#xff0c;无需上位机软件。通过简单的串口指令即可完成三种存储设备的音频插…

Linux配置jdk、tomcat、mysql离线安装与启动

目录 1.jdk安装 2.tomcat的安装&#xff08;开机自启动&#xff09; 3.MySQL的安装 4.连接项目 1.jdk安装 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 解压安装包 这里需要解压到usr/local目录下&#xff0c;在这里我新建一个文件夹…

Javaweb之SpringBootWeb案例之配置优先级的详细解析

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

21.scala泛型结合隐式转换使用

目录 概述实践代码执行 结束 概述 scala泛型结合隐式转换使用 实践 代码 package com.fun.scala/*** 视图界定*/ object Genericity04 {def main(args: Array[String]): Unit {val s1 new Stu("test", 33)val s2 new Stu("test2", 32)println(new M…