java -数据结构,单向链表

news2024/11/24 14:43:51

顺序表的问题及思考:

  1. 顺序表中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间

思考: 如何解决以上问题呢?下面给出了链表的结构来看看

一、链表

1.1、链表的概念及结构

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的
在这里插入图片描述

在这里插入图片描述

1.1.1、创建一个类表示节点 - ListNode

//NodeList 表示节点 类
class ListNode{
    //值域
    public int val;
    //下一个节点的地址
    public ListNode next;

    public ListNode(int val){
        this.val = val;
    }
}

在这里插入图片描述

1.1.2、创建一个类来表示链表 - MyLinkedList

//ListNode 表示节点 类
class ListNode{
    //值域
    public int val;
    //下一个节点的地址
    public ListNode next;

    public ListNode(int val){
        this.val = val;
    }
}

public class MyLinkedList {
    public static void main(String[] args) {
        //当new 一个节点的时候就是创建一个节点,值为 1
        ListNode nodeList = new ListNode(1);

    }
}

new 一个节点

如和创建多个节点,让这些节点串起来

首先要有一个头结点

单向,带头,不循环的单链表
在这里插入图片描述

理解链表中: 带头、不带头、单向、双向、循环、不循环的意思

带头 和 不带头

在这里插入图片描述

循环 和 不循环

在这里插入图片描述

单向 和 双向

在这里插入图片描述

1.1.3、模拟实现 单向 不带头 非循环的链表

在这里插入图片描述

用过列举的方式,创建几个节点,然后将他们连接起来

//ListNode 表示节点 类
class ListNode{
    //值域
    public int val;
    //下一个节点的地址
    public ListNode next;

    public ListNode(int val){
        this.val = val;
    }
}

public class MyLinkedList {
    public ListNode head;
    
    //创建5个节点的链表
    public void creatList(){
        //当new 一个节点的时候就是创建一个节点,值为 1
        ListNode ListNode1 = new ListNode(10);
        ListNode ListNode2 = new ListNode(20);
        ListNode ListNode3 = new ListNode(30);
        ListNode ListNode4 = new ListNode(40);
        ListNode ListNode5 = new ListNode(50);

        ListNode1.next = ListNode2;
        ListNode2.next = ListNode3;
        ListNode3.next = ListNode4;
        ListNode4.next = ListNode5;

        this.head = ListNode1;
    }
}

在这里插入图片描述
此时就有5个节点了

1.1.4、遍历链表数据

首先,我要区分清楚,链表 不是顺序表,不是一块连续的空间。 链表的每个元素 是由地址来连接起来的。
也就是说 我们不能使用普通思维模式 去思考 遍历链表的数据域的值

既然 链表是靠地址联系起来的,也就是说 靠 next域中 存储的地址来联系个节点的数据,
这就是我们突破点。
利用 head 遍历每个每个节点的数据 写法 head = head.next,你可以参考上面的图,来细品。
这样我们就跳转到下一个节点,算了我还是画个图,请看下图

//打印链表的数据
    public void disPlay(){
        ListNode cur = this.head;
        while(cur != null){
            System.out.print(cur.val + " " );
            cur = cur.next;
        }
        System.out.println();
    }

在这里插入图片描述

测试一下:

public class TestDome {
    public static void main(String[] args) {
        MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.creatList();
        myLinkedList.disPlay();

    }
}

.2.1、

1.2、链表里面的操作

1.2.1、得到单链表的长度

//得到单链表的长度
    public int size(){
        int usedSize = 0;
        ListNode cur = this.head;
        while(cur != null){
            cur = cur.next;
            usedSize++;
        }
        return usedSize;
    };

1.2.2、头插法

//头插法
    public void addFirst(int data){
        ListNode node = new ListNode(data);
        node.next = head;
        head = node;
    };

在这里插入图片描述

1.2.3、尾插法

//尾插法
    public void addLast(int data){
        ListNode node = new ListNode(data);
        ListNode cur = this.head;
        //判断链表是否为空
        if(this.head == null){
            this.head = node;
        } else{
            while(cur.next != null){
                cur = cur.next;
            }
            cur.next = node;
        }
    };

在这里插入图片描述

1.2.4、查找是否包含关键字key是否在单链表当中

//查找是否包含关键字key是否在单链表当中
    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key){
        ListNode cur = head;
        while(cur != null){
            if(cur.val == key){
                return true;
            }
            cur = cur.next;
        }
        return false;
    };

为

1.2.5、任意位置插入,第一个数据节点为0号下标

/任意位置插入,第一个数据节点为0号下标
    public void addIndex(int index,int data){
        ListNode node = new ListNode(data);
        if(index < 0 || index > size()){
            System.out.println("index 位置不合法!");
            return;
        }
        if(index == 0){
            addFirst(data);
            return;
        }
        if(index == size()){
            addLast(data);
            return;
        }

        //中间位置
        ListNode cur = this.head;
        while(index - 1 != 0){
            cur = cur.next;
            index--;
        }
        node.next = cur.next;
        cur.next = node;

    };

在这里插入图片描述

1.2.6、删除第一次出现关键字为key的节点

//删除第一次出现关键字为key的节点
    public void remove(int key){
        //当链表为空的时候
        if(size() == 0){
            System.out.println("删除失败,链表为空!");
            return;
        }
        //当删除的是头节点的时候
        if(this.head.val == key){
            this.head = this.head.next;
            return;
        }
        ListNode cur = this.head;
        while(cur.next != null){
            if(cur.next.val == key){
                cur.next = cur.next.next;
                return;
            }
            cur = cur.next;
        }
        return;
    };

在这里插入图片描述

1.2.7、删除所有值为key的节点

 //删除所有值为key的节点
    public void removeAllKey(int key){
        if(this.head == null){
            System.out.println("链表为空!");
            return;
        }
        //cur.val 就是删除的值
        ListNode prev = this.head;
        ListNode cur = this.head.next;
        while (cur != null){
            if(cur.val == key){
                prev.next = cur.next;
                cur = cur.next;
            }else{
                prev = cur;
                cur = cur.next;
            }
        }
        //删除头结点
        if(head.val == key){
            this.head = head.next;
        }
    };

在这里插入图片描述

1.2.8、清除单链表

清除链表里面的数据的时候,最好是一个节点一个节点的释放(置为null)

//清除单链表
    public void clear(){
        //粗暴的做法
        //this.head = null;
        while (this.head != null){
            ListNode curNext = this.head;
            this.head = null;
            head = curNext;
        }
    };

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

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

相关文章

HTTP和HTTPS协议(必备知识)

文章目录1、什么是HTTP协议2、HTTP协议格式<1>HTTP请求方法<2>HTTP的状态码3、HTTP是不保存状态的协议<1>使用Cookie的状态管理3、HTTPS<1>加密方式<2>理解HTTPS加密过程1、什么是HTTP协议 HTTP协议常被称为超文本传输协议&#xff0c;HTTP协议…

【网安神器篇】——mimikatz系统取证工具

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

C语言第十二课(中):操作符详解【单目、关系、逻辑、条件操作符】

目录 前言&#xff1a; 一、单目操作符&#xff01;、-、、&、sizeof、~、--、、*、(类型)&#xff1a; 1.逻辑反操作&#xff01;&#xff1a; 2.正负值操作符-、&#xff1a; 3.取地址操作符 &与解引用操作符 *&#xff1a; ①.取地址操作符&&#xff1a; ②.解…

数据结构与算法基础(王卓)(3)

前置&#xff1a; //#include<iostream> #include<stdlib.h>//存放exit#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define MAXlength 100 //初始大小为100&…

小程序开发音视频问题汇总及解决方案

目录 问题一&#xff1a;开发音视频&#xff0c;必用的两个小程序组件live-player和live-pusher&#xff0c;他们做什么用的&#xff0c;怎么才能使用&#xff1f; 问题二&#xff1a;一个页面只能插入一个 问题三&#xff1a;真机调试图片预览及视频全屏无反应 问题四&am…

图库 | 图存储的基础概念

前言 图存储的全称叫图数据库存储引擎或图数据库存储层&#xff08;组件&#xff09;。在功能层面&#xff0c;它负责图数据库或图数仓的数据的持久化存储。因为存储距离用户层的应用较图计算更为遥远&#xff0c;过往很少有论著会专门讲述图存储环节&#xff0c;但笔者要说的…

Python搭建虚拟环境

一、简介 1.特点&#xff1a; python的虚拟环境类似于虚拟机&#xff0c;能够创建一个独立的python运行环境&#xff0c; 虚拟环境中的安装的第三方依赖包和全局环境中的包相互独立。 2.环境 1. python3.3以上版本(自带venv模块&#xff0c;若已安装则可直接改变环境变量来…

【软件安装】Linux中RabbitMQ的安装

① 本篇是基于Linux操作系统中的安装&#xff0c;故先准备一个干净的Linux操作系统。本文中所有的操作基于CentOS8进行安装演示&#xff1b; ② 接下来的演示文本中&#xff0c;红色字体为操作步骤&#xff0c;黑色字体为解释说明&#xff1b; ③ 确保Linux系统中已经安装好必…

LightGBM 实现基于内容的个性化推荐

大家好&#xff0c;本文中&#xff0c;我将和大家一起学习如何训练 LightGBM 模型来估计电子商务广告的点击率的推荐系统的例子。将在Criteo数据集上训练一个基于LightGBM的模型。 LightGBM是一个基于树的梯度提升学习算法框架。是基于分布式框架设计的&#xff0c;因而非常高…

汇川伺服电机位置控制模式参数配置

1. 基本控制参数设置 1&#xff09;设置位置控制模式 2&#xff09;绝对值位置线性模式 2.端子输入参数设置 1&#xff09;将输入端子使能失效 3. 位置控制参数设置 1&#xff09;将位置来源设置为2&#xff1a;多段位位置指令 4.通信参数设置 1&#xff09;波特率设置为960…

单元测试我们需要知道哪些?

前言趁着刚读完《认知天性》这书&#xff0c;书有一点这样说&#xff1a;「我们学习行为更多凭着直觉&#xff0c;即使我们已经看到了科学数据&#xff0c;但我们也不愿意去相信自己的直觉存在问题。」那和我们单元测试有什么关系呢&#xff1f;这时我突然有一个问题&#xff1…

19-28-hive-数据类型-DDL

19-hive-数据类型-DDL&#xff1a; 基本数据类型 Hive 数据类型Java 数据类型长度例子TINYINTbyte1byte 有符号整数20SMALINTshort2byte 有符号整数20INTint4byte 有符号整数20BIGINTlong8byte 有符号整数20BOOLEANboolean布尔类型&#xff0c;true 或者falseTRUE FALSEFLOAT…

【Python】Labelme/PIL读取图片朝向错误解决

文章目录一、问题背景二、产生原因三、解决方案一、问题背景 发现使用labelme直接读取含imageData&#xff08;将图片bytes数据使用base64编码后的str数据&#xff09;的json文件时&#xff0c;读上来的图片会发生自动旋转的问题。比如原先是横放的图&#xff0c;读进来后就成…

虚拟化基本知识及virtio-net初探

QEMU/KVM是在Linux中被广泛使用的虚拟化技术之一&#xff0c;而virtio作为一个半虚拟化I/O事实上的标准[1]&#xff0c;是QEMU/KVM在I/O虚拟化部分的默认实现。virtio-net是virtio标准中的网卡设备&#xff0c;被广泛应用。本文将会沿着虚拟化&#xff0c;virtio半虚拟化I/O&am…

非对称风险模型

推荐模型&#xff1a;非对称性风险&#xff0c;让自己置身于一个好结果比坏结果影响大得多的环境中 比如投资&#xff0c;将85%~90%投入到极低风险的资产中&#xff08;国债&#xff09;&#xff0c;来享受确定性收益&#xff1b;剩下的投入的10%~15%投入到极高风险资产中&…

使用FeatureTask多线程优化in,提高查询速度

场景是这样的&#xff1a;使用in查询数据的时候&#xff0c;in的数量越多&#xff0c;效率越低&#xff0c;所以一个优化的思路是&#xff0c;缩小in查询的数量&#xff0c;用多线程的方式查询缩小数量后in的sql&#xff0c;并行查询。 直接上代码&#xff1a; public List&l…

Linux零基础入门(四)Linux实用操作

Linux零基础入门&#xff08;四&#xff09;Linux实用操作前言Linux实用操作一 各类小技巧&#xff08;快捷键&#xff09;1 ctrl c 强制停止2 ctrl d 退出或登出3 历史命令搜索4 光标移动快捷键5 清屏二 软件安装1 Linux系统的应用商店2 yum命令3 apt命令 - 扩展三 systemct…

全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么

全光谱台灯是指灯光色谱丰富度与太阳光一般全面的台灯&#xff0c;这样的灯光照射下的任何物体&#xff0c;不但颜色丰富多彩&#xff0c;而且极其真实&#xff0c;无限接近太阳光下的真实色彩&#xff0c;对人眼舒适度有巨大的提升&#xff0c;所以全光谱台灯不但对孩子无害&a…

5G无线技术基础自学系列 | MU-MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 MU-MIMO是指多个用户在上下行数据传输时…

算法实操:Python代码实现直插排序(含有序在前有序在后)

【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 自学并不是什么神秘的东西&#xff0c;一个人一辈子自学的时间总是比在学校学习的时间长&a…