看一下链表结构

news2025/2/25 15:47:42

序、慢慢来才是最快的方法。

背景

链表(Linked List)
链表是一种常见的基础数据结构,是一种线性表。与顺序表不同的是,链表中的每个节点不是顺序存储的,而是通过节点的指针域指向到下一个节点。

1.链表的优缺点

2.链表的类型

单链表、双链表、循环链表、静态链表。

1.单链表

  • element:用来存放元素
  • next:用来指向下一个节点元素
  • 通过每个结点的指针指向下一个结点从而链接起来的结构,最后一个节点的next指向null。

代码示例:

//单向链表
class SingleLinkedList{

    //先初始化一个头节点, 头节点不要动, 不存放具体的数据
    private Node head = new Node("");

    //添加节点
    public void add(Node node){
        Node temp = head;
        while (true){
            if(temp.next == null){
                break;
            }
            temp = temp.next;
        }
        temp.next = node;
    }

    // 插入新节点到链表的头部  
    public void insertAtHead(String data) {  
        Node newNode = new Node(data);  
        if (head != null) {  
            //新链表的next直接指向head即可。
            newNode.next = head;  
        }  
        head = newNode;  
    }  


    //删除节点
    public void del(String element) throws Exception {
        Node temp = head;
        boolean flag = false; // 标志是否找到待删除节点的

        while (true){
            if(temp.next == null){//最后一个节点
                break;
            }
            if(temp.next.element == element){
                flag = true;
                break;
            }
            temp = temp.next;
        }

        if(flag){
            temp.next = temp.next.next;
        } else {
            throw new Exception("没有找到要删除的节点");
        }
    }
    
    //定义节点
    class Node{
        public String element;//用来存放元素
        public Node next; //指向下一个节点
        
        public Node(String element) {
            super();
            this.element = element;
        }
    }
}

单链表反转

反转链表问题在面试中出现频率 非常非常高,相信有过几次面试经验的同学都会同意这个观点。

解法1:递归
  //递归解法
    private Node reversetList(Node node) {
        if (node == null || node.next == null) {
            return head;
        }

        Node nodePre= reversetList(node);
        node.next.next = node.next;
        node.next = null;

        return nodePre;
    }
解法2:迭代
   //单链表反转 迭代
    private Node reversetList1(Node node) {
        //如果当前链表为null,或者只有一个节点,则无需反转
        if (node == null && node.next == null) {
            return node;
        }

        //定义一个辅助的指针(变量),帮助我们遍历原来的链表
        Node cur = node.next;
        Node next = null;// 指向当前节点[cur]的下一个节点
        Node reverseNode = new Node("");

        while (cur != null) {
            next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
            cur.next = reverseNode.next;///将cur 的下一个节点指向新的链表的最前端
            reverseNode = cur;将cur 连接到新的链表上
            cur = next;//让cur 后移
        }

        return reverseNode;
    }

2.双链表

单向链表的好处很多,虽然单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后" 找,而 "从后往前" 找并不是它的强项,因此我们就有了双向链表这个东西,双向链表顾名思义就是链表的高级版,他与单向链表有所不同的一点在于在具有尾巴结点,并且双向链表的每一个结点都会有两个指向,一个指向前面的结点,一个指向后面的结点,当然头结点的前端指向为null,后结点的后端指向为null。
 

element、pre、next 跟前面的一样。

第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,形成一个环。

代码示例

public ListNode head;
    public ListNode last;
    public TowWayNodeList(int num){
        this.head = new ListNode(num);
        this.last = this.head;
    }


//头插法
    public void addFirst(int num){
        ListNode node = new ListNode(num);
        if(head == null){
            this.head = node;
            this.last = node;
        }else{
            node.next = this.head;
            this.head.prev = node;
            this.head = node;
        }
    }


//尾插发
public void addLast(int data){
        ListNode node = new ListNode(data);
        if(head == null){
            this.head = node;
            this.last = node;
        }else{
            this.last.next = node;
            node.prev = this.last;
            this.last = node;
        }
    }

参考

数据结构与算法 #1 链表问题总结 - 掘金

leetcode 206 号算法题:反转单链表【数据结构与算法】_哔哩哔哩_bilibili

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

Java实现双向链表_双向链表java实现_跑不死的程序员的博客-CSDN博客

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

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

相关文章

UDP 的报文结构

UDP的报文结构: 其中前面的源端口号和目的端口号,UDP长度和UDP检验和,它们都是2个字节。 那么什么是UDP长度呢,它指的是后面的数据的长度,换算单位也就是64kb,因此一个数据报(数据)最…

idea 启动项目报错 Command line is too long

1.idea 启动报错 Command line is too long&#xff0c;启动报错信息&#xff1a;Error running ‘Application‘: Command line is too long. 2.如何解决&#xff1f; 1&#xff09;idea打开一个项目。 2.打开项目下的*.idea* 文件夹下的 workspace.xml 文件。 3.在<co…

【高阶数据结构】图详解第三篇:最小生成树(Kruskal算法+Prim算法)

文章目录 最小生成树1. 最小生成树概念2. Kruskal算法算法思想代码实现测试 3. Prim算法算法思想代码实现测试 4. 源码 最小生成树 1. 最小生成树概念 在了解最小生成树之前&#xff0c;我们先来回顾一下生成树的概念&#xff0c;这是我们之前文章提到过的&#xff1a; 无向图…

QMA6100P 姿态传感器使用

QMA6100P 姿态传感器使用 项目用途&#xff1a;分析和记录设备位置信息变化&#xff08;设备安装在车辆内部&#xff09; 通讯接口&#xff1a;I2C&#xff0c;地址0x13&#xff0c;标准I2C通讯采用IO模拟 功能需求&#xff1a;读取三轴加速度 芯片初始化设置 参考手册说明和…

STM32 芯片怎么选型?

SMT32概览&#xff1a; STM32F051R8T6x xx 代表的含义 STM32MPU产品型号含义 STM32芯片封装&#xff1a;

浮点数运算以及溢出问题

一、浮点数加减运算的步骤 对阶&#xff1a;小阶向大阶对齐&#xff0c;阶小的那个数尾数右移&#xff0c;对于IEEE754标准表示的浮点数来说&#xff0c;右移时要注意将隐含的一位1右移到小数部分尾数加减&#xff1a;注意要先还原隐藏位尾数规格化&#xff1a;直到将第一位1移…

外汇天眼:外汇投资出入金难?教你一个快速到账的方法!

对于每一位投资者来说&#xff0c;在外汇市场中盈利赚钱才是最重要的事&#xff01;而对盈利来说最重要的事就是能够顺利地出入金&#xff01; 但在复杂的外汇市场中&#xff0c;摒弃黑平台&#xff0c;在正规平台出入金很多时候也并没有那么顺利&#xff0c;所以很多外汇投资…

MySQL常用脚本

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

Godot2D角色导航-自动寻路教程(Godot实现角色随鼠标移动)

文章目录 运行结果2D导航概述开始前的准备2D导航创建导航网格创建角色 其他文章 运行结果 2D导航概述 Godot为2D和3D游戏提供了多个对象、类和服务器&#xff0c;以便于基于网格或基于网格的导航和路径查找。 说到导航&#xff0c;就得说一下导航网格&#xff0c;导航网格定义…

Design patterns--策略模式

设计模式之策略模式 笔者经常使用Modbus TCP和Modbus RTU通信协议&#xff0c;而两种的请求数据的格式不一样&#xff0c;故而采用策略模式来健壮整个工程项目。 代码示例 #ifndef MODBUS_H #define MODBUS_H #include <string>std::string convertToHex(unsigned char…

Spring framework Day09:JSR250注入注解

前言 JSR 250 是 Java Specification Request 的缩写&#xff0c;它定义了一组用于依赖注入和生命周期管理的注解。这些注解是在 Java EE 5 规范中引入的&#xff0c;用于简化和标准化开发企业级应用程序的依赖注入和生命周期管理。 一、开始学习 本次需要学习的依然是注解&…

淘宝商品品牌数据采集接口,淘宝商品详情数据接口,淘宝API接口

采集淘宝商品品牌数据&#xff0c;可以按照以下步骤进行&#xff1a; 确定采集目标&#xff1a;确定要采集的淘宝商品品牌和具体的产品类型。选择采集工具&#xff1a;可以选择爬虫、数据抓取工具等采集工具进行数据采集。设置采集参数&#xff1a;设置采集参数&#xff0c;包…

ROS中的图像数据

无论是USB摄像头还是RGBD摄像头&#xff0c;发布的图像数据格式多种多样&#xff0c;在处理这些数据之前&#xff0c;我们首先需要了解这些数据的格式。 二维图像数据 连接USB摄像头到PC端的USB接口&#xff0c;通过以下命令启动摄像头&#xff1a; roslaunch usb_cam usb_ca…

PHP 员工工资管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 员工工资管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php员工工资管理系统 代码 https://download.csdn.net/download/qq_41221322/884215…

睿趣科技:未来抖音开网店还有前景吗

随着科技的快速发展&#xff0c;电商平台已经成为了人们生活中不可或缺的一部分。在中国&#xff0c;抖音作为一个短视频平台&#xff0c;近年来迅速崛起&#xff0c;吸引了大量的用户和商家。那么&#xff0c;在未来&#xff0c;抖音是否还能为商家提供一个有效的电商平台呢?…

【LeetCode】2319. 判断矩阵是否是一个X矩阵

难度&#xff1a;简单 题目 如果一个正方形矩阵满足下述 全部 条件&#xff0c;则称之为一个 X 矩阵 &#xff1a; 矩阵对角线上的所有元素都 不是 0矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid &#xff0c;表示一个正方形矩阵。如果 grid 是一个…

小谈设计模式(28)—解释器模式

小谈设计模式&#xff08;28&#xff09;—解释器模式 专栏介绍专栏地址专栏介绍 解释器模式角色分析抽象表达式&#xff08;Abstract Expression&#xff09;终结符表达式&#xff08;Terminal Expression&#xff09;非终结符表达式&#xff08;Non-terminal Expression&…

opencv图像卷积操作和常用的图像滤波函数

文章目录 opencv图像卷积操作原理&#xff0c;opencv中常用的图像滤波函数一、图像卷积操作原理&#xff1a;1、卷积操作原理图&#xff1a; 二、opencv常用的图像滤波函数&#xff1a;这些函数的主要作用是对图像进行平滑处理或去除噪声(核心目的是减少图像中的噪声&#xff0…

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…

spring自动装配byType和@Autowired依赖注入源码分析(史上最详细的Spring源码分析系列一)

写在前面&#xff1a;阅读spring源码需要读者对Java反射和动态代理有一定了解。关于这部分内容&#xff0c;可以参考这篇博客&#xff1a;Spring源码分析准备工作及java知识补充 一、Spring依赖注入的方式 关于spring的依赖注入&#xff0c;可以参考官方文档&#xff1a;Spring…