数据结构-列表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://www.rhkb.cn/news/263633.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity学习(40)——创建(create)角色脚本(panel)——UI

1.点击不同的头像按钮&#xff0c;分别选择职业1和职业2&#xff0c;create脚本中对应的函数。 2.调取inputfield中所输入的角色名&#xff08;限制用户名长度为7字符&#xff09;&#xff0c;但愿逆向的服务器可以查重名&#xff1a; 3.点击头衔&#xff0c;显示选择的职业&a…

Spring Boot 手写starter!!!

原因&#xff1a;为什么要手写starter&#xff1f;&#xff1f;&#xff1f; 原因&#xff1a;简化功能。 实例&#xff1a;以分页为例&#xff1a;写一个starter。 1.首先定义一个PageX注解。 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented p…

LeetCode 热题 100 | 二叉树(一)

目录 1 基础知识 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 2 94. 二叉树的中序遍历 3 104. 二叉树的最大深度 4 226. 翻转二叉树 5 101. 对称二叉树 菜鸟做题&#xff0c;语言是 C 1 基础知识 二叉树常见的遍历方式有&#xff1a; 先序遍历中序遍历后序遍历…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列&#xff08;定时消息&#xff09;6.重试队列7.死信队列8.消息语…

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为&#xff1a;感知机(Neuron)的学习算法主要包括以下步骤&#xff1a;感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法&#xff0c;用于将输入…

jmeter下载base64加密版pdf文件

一、何为base64加密版pdf文件 如下图所示&#xff0c;接口jmeter执行后&#xff0c;返回一串包含大小写英文字母、数字、、/、的长字符串&#xff0c;直接另存为pdf文件后&#xff0c;文件有大小&#xff0c;但是打不开&#xff1b;另存为doc文件后&#xff0c;打开可以看到和…

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(二)

文章目录 上一篇效果演示Puppeteer 修改浏览器的默认下载位置控制并发数错误重试并发控制 错误重试源码 上一篇 Puppeteer 使用实战&#xff1a;如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客&#xff08;一&#xff09; 效果演示 上一篇实现了一些基本功能&#xff0c;…

Maxwell安装部署

1 Maxwell输出格式 database&#xff1a;变更数据所属的数据库table&#xff1a;变更数据所属的表type&#xff1a;数据变更类型ts&#xff1a;数据变更发生的时间xid&#xff1a;事务idcommit&#xff1a;事务提交标志&#xff0c;可用于重新组装事务data&#xff1a;对于inse…

uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题

注意下面的方法只能在app端使用&#xff0c; let wv plus.webview.create("","custom-webview",{plusrequire:"none", uni-app: none, width: 300,height:400,top:uni.getSystemInfoSync().statusBarHeight44 }) wv.loadURL("https://ww…

浅析Linux设备驱动:DMA内存映射

文章目录 概述DMA与Cache一致性DMA映射类型一致性DMA映射dma_alloc_coherent 流式DMA映射dma_map_single数据同步操作dma_direct_sync_single_for_cpudma_direct_sync_single_for_device 相关参考 概述 现代计算机系统中&#xff0c;CPU访问内存需要经过Cache&#xff0c;但外…

第6.4章:StarRocks查询加速——Colocation Join

目录 一、StarRocks数据划分 1.1 分区 1.2 分桶 二、Colocation Join实现原理 2.1 Colocate Join概述 2.2 Colocate Join实现原理 三、应用案例 注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Colocation Join 官网文章地址&#xff1a; Colocate Join | StarRoc…

32单片机基础:GPIO输出

目录 简介&#xff1a; GPIO输出的八种模式 STM32的GPIO工作方式 GPIO支持4种输入模式&#xff1a; GPIO支持4种输出模式&#xff1a; 浮空输入模式 上拉输入模式 下拉输入模式 模拟输入模式&#xff1a; 开漏输出模式&#xff1a;&#xff08;PMOS无效&#xff0c;就…

【笔记】【开发方案】APN 配置参数 bitmask 数据转换(Android KaiOS)

一、参数说明 &#xff08;一&#xff09;APN配置结构对比 平台AndroidKaiOS文件类型xmljson结构每个<apn>标签是一条APN&#xff0c;包含完成的信息层级数组结构&#xff0c;使用JSON格式的数据。最外层是mcc&#xff0c;其次mnc&#xff0c;最后APN用数组形式配置&am…

(done) 什么是正定矩阵?Positive Definite Matrices

正定矩阵的定义&#xff1a;https://baike.baidu.com/item/%E6%AD%A3%E5%AE%9A%E7%9F%A9%E9%98%B5/11030459 正定矩阵的作用、验证视频&#xff1a;https://www.bilibili.com/video/BV1Ag411M76G/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c…

UE4 C++联网RPC教程笔记(三)(第8~9集)完结

UE4 C联网RPC教程笔记&#xff08;三&#xff09;&#xff08;第8~9集&#xff09;完结 8. exe 后缀实现监听服务器9. C 实现监听服务器 8. exe 后缀实现监听服务器 前面我们通过蓝图节点实现了局域网连接的功能&#xff0c;实际上我们还可以给项目打包后生成的 .exe 文件创建…

【力扣hot100】刷题笔记Day10

前言 一鼓作气把链表给刷完&#xff01;&#xff01;中等题困难题冲冲冲啊啊啊&#xff01; 25. K 个一组翻转链表 - 力扣&#xff08;LeetCode&#xff09; 模拟 class Solution:def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:# 翻转…

C语言中的字体背景颜色汇总

客官请看效果 客官请看代码 #include <stdio.h> #include <stdlib.h> #include <windows.h>int main() {int i;for (i 0; i < 254; i) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), i); // 设置当前文本颜色为循环变量对应的颜色printf(…

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

LabVIEW燃料电池船舶电力推进监控系统

LabVIEW燃料电池船舶电力推进监控系统 随着全球经济一体化的推进&#xff0c;航运业的发展显得尤为重要&#xff0c;大约80%的世界贸易依靠海上运输实现。传统的船舶推进系统主要依赖于柴油机&#xff0c;这不仅耗能高&#xff0c;而且排放严重&#xff0c;对资源和环境的影响…

128 Linux 系统编程6 ,C++程序在linux 上的调试,GDB调试

今天来整理 GDB 调试。 在windows 上我们使用vs2017开发&#xff0c;可以手动的加断点&#xff0c;debug。 那么在linux上怎么加断点&#xff0c;debug呢&#xff1f;这就是今天要整理的GDB调试工具了。 那么有些同学可能会想到&#xff1a;我们在windows上开发&#xff0c;…