双链表的基本操作

news2025/7/19 19:11:48

目录

一、双链表的设计

二、双链表的实现和基本操作

 1.实现双链表节点以及设置first、last指针

2.获取当前链表中元素的数量

3.获取指定位置的节点

4.在尾部添加结点元素

5.在指定位置添加元素

6.删除指定位置的结点


一、双链表的设计

 针对于查询操作,我们可以从前往后遍历,也可从后往前遍历。

二、双链表的实现和基本操作

 1.实现双链表节点以及设置first、last指针

//注意:这里的first和last节点,跟单链表中的头结点不一样,
//     头结点是专门的一个节点指向链表第一个结点
//     而这里的first和last节点相当于指针一样,指向第一个和最后一个节点

public class MyDoubleLinkedList<T> {
    //节点类设计,设计结点内部类
    public class Node{
        //存储数据的变量
        T item;
        //指向上一个节点的引用
        Node prev;
        //指向下一个结点的引用
        Node next;

        public Node(Node prev,T item, Node next) {
            this.item = item;
            this.prev = prev;
            this.next = next;
        }
    }

    //注意:这里的first和last节点,跟单链表中的头结点不一样,
    //     头结点是专门的一个节点指向链表第一个结点
    //     而这里的first和last节点相当于指针一样,指向第一个和最后一个节点

    //声明第一个结点
    Node first;
    //声明最后的结点
    Node last;
    //定义链表的长度
    int size;
    //构造方法初始化size

    public MyDoubleLinkedList() {
        size = 0;
    }

2.获取当前链表中元素的数量

//获取当前存储元素的数量
    public int size(){
        return this.size;
    }

3.获取指定位置的节点

//根据位置获取元素
    public Node getNode(int pos){
        int middle = this.size/2;
        Node x;

        if (pos < middle){//如果目标结点在前半部分,则从前面开始遍历
            x = first;
            for (int i = 0;i<pos;i++){
                x = x.next;
            }
        }else {//如果目标结点在后半部分,则从后面开始遍历
            x = last;
            for (int i = size-1;i>pos;i--){
                x = x.prev;
            }
        }
        return x;
    }

4.在尾部添加结点元素

思路:将需要插入的结点前指针指向last(链表中最后一个节点),
//     再将last的next指针指向需要插入的结点,
//     最后将last游标移动到新插入的结点(即最后一个节点),将最后一个节点赋值给last。
    //在尾部添加元素
    //思路:将需要插入的结点前指针指向last(链表中最后一个节点),
    //     再将last的next指针指向需要插入的结点,
    //     最后将last游标移动到新插入的结点(即最后一个节点),将最后一个节点赋值给last。
    public void add(T t){
        //将last存储在prev结点,last为链表最后一个节点
        Node prev = last;
        //创建需要插入的结点,同时将节点前指针指向last
        Node node = new Node(prev,t,null);
        //将prev的next指向新插入的结点
        //如果last为空,则链表中没有节点元素,为插入的第一个结点,
        // 将first、last游标都指向插入的第一个结点
        if (prev == null){
            first = node;
        }else {
            prev.next = node;
        }
        //将last游标指向新插入的结点
        last = node;
        //链表长度加一
        this.size++;
    }

5.在指定位置添加元素

思路:一共有四种情况需要考虑,
//     1.在链表尾部插入节点    2.在链表中正常插入节点
//     3.链表中没有元素       4.链表中只有一个元素且在第一个元素前插入。

//在指定位置添加元素
    //思路:一共有四种情况需要考虑,
    //     1.在链表尾部插入节点    2.在链表中正常插入节点
    //     3.链表中没有元素       4.链表中只有一个元素且在第一个元素前插入。
    public void add(int pos,T t){
        if (pos == size){//如果在尾部插入节点,则调用尾部插入节点方法
            add(t);
        }else {//否则不在尾部插入,在链表中或链表第一个位置插入
            //将需要插入的元素创建成节点
            Node node = new Node(null,t,null);
            //获取当前要插入节点的位置
            Node current = this.getNode(pos);
            if (current == null){
                //链表没有元素的时候
                first = node;
            }else {
                //获取插入节点的前一个位置结点
                Node prev = current.prev;
                //将node的prev设置成prev节点
                node.prev = prev;
                //将node的next节点设置成current节点
                node.next = current;
                //将current的prev设置成node
                current.prev = node;
                if (prev == null){//如果链表中只有一个节点
                    //将first指向插入的元素
                    first = node;
                }else {
                    //将prev的next设置成node
                    prev.next = node;
                }
            }
        }
        //链表长度加一
        this.size++;
    }

6.删除指定位置的结点

思路:分三种情况:
//     1.在链表中的正常位置删除结点
//     2.删除链表中第一个结点
//     3.删除链表中最后一个节点
//指定位置的删除功能
    //思路:分三种情况:
    //     1.在链表中的正常位置删除结点
    //     2.删除链表中第一个结点
    //     3.删除链表中最后一个节点
    public void remove(int pos){
        //获取当前需要删除的结点
        Node node = this.getNode(pos);
        //获取前一个结点
        Node prev = node.prev;
        //获取下一个节点
        Node next = node.next;

        //删除元素,将前一个结点与后一个节点相连
        if (prev == null){//如果需要删除的结点是第一个结点
            //将first节点指向next
            first = next;
        }else {
            prev.next = next;
        }
        if (next == null){//如果删除的结点是最后一个节点
            //将last节点指向prev
            last = prev;
        }else {
            next.prev = prev;
        }
        //链表长度减一
        this.size--;
    }

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

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

相关文章

计算机操作系统:实验3 【虚拟存储器管理】

计算机操作系统&#xff1a;实验3 【虚拟存储器管理】 文章目录计算机操作系统&#xff1a;实验3 【虚拟存储器管理】一、前言二、实验目的三、实验环境四、实验内容五、实验说明1、设计中虚页和实页的表示2、关于缺页次数的统计3、LRU算法中“最近最久未用”页面的确定4、算法…

删除类及其对象的属性:delattr()函数

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 删除类及其对象的属性 delattr()函数 [太阳]选择题 请问对以下Python代码说法错误的是&#xff1f; class MyClass1: x 1 y 2 myObject1 MyClass1() print(【访问】myObject1的属…

Revit中“结构框架显示与剪切“的应用和一键剪切功能

一、Revit关于"结构框架显示与剪切"的应用 结构框架&#xff1a;顾名思义其实它表示的就是结构梁而已&#xff0c;但是我们画图的时候往往会显示"实线"和"虚线"&#xff0c;以至于在出结构图纸的时候&#xff0c;达不到出图要求 NO.2、应用 Part…

ISCTF

upload upload,一道phar文件上传题目 <?php class upload{public $filename;public $ext;public $size;public $Valid_ext;public function __construct(){$this->filename $_FILES["file"]["name"];$this->ext end(explode(".", …

[山东科技大学OJ]1490 Problem F: 该按哪些键

Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1693 Solved: 433 [Submit][Status] Description Peter在手机上打字时一直用全键键盘来输入&#xff0c;但最近不知道怎么搞的&#xff0c;把全键键盘弄丢了&#xff0c;只剩下了9键键盘。一项喜欢高科技的Peter却不会用9键…

彻底搞懂nodejs事件循环

nodejs是单线程执行的&#xff0c;同时它又是基于事件驱动的非阻塞IO编程模型。这就使得我们不用等待异步操作结果返回&#xff0c;就可以继续往下执行代码。当异步事件触发之后&#xff0c;就会通知主线程&#xff0c;主线程执行相应事件的回调。 以上是众所周知的内容。今天…

ASEMI整流桥D3KB100参数,D3KB100规格,D3KB100封装

编辑-Z ASEMI整流桥D3KB100参数&#xff1a; 型号&#xff1a;D3KB100 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1000V RMS反向电压VR(RMS)&#xff1a;700 平均整流输出电流&#xff08;IO&#xff09;&#xff1a;3A 峰值正向浪涌电流&#xff08…

【论文阅读】时序动作检测系列论文精读(2019年)

文章目录1. BMN: Boundary-Matching Network for Temporal Action Proposal Generation论文目的——拟解决问题贡献——创新实现流程详细方法2. MGG: Multi-granularity Generator for Temporal Action Proposal论文目的——拟解决问题贡献——创新实现流程详细方法3. P-GCN: G…

稳压二极管的应用及注意事项

文章目录稳压二极管也被称为齐纳二极管 齐纳二极管和普通二极管的伏安特性曲线 齐纳二极管的工作原理 稳压二极管的伏安特性曲线的正向特性和普通二极管差不多&#xff0c;反向特性是在反向电压低于反向击穿电压时&#xff0c;反向申阳很大&#xff0c;反向漏电流极小。但是…

【学习笔记】AGC028/AGC007

AGC028 Removing Blocks High Elements 好仙啊。 我会转化&#xff01;&#xff01;问题转化为在原序列剩下的数中取ISISIS序列aaa,bbb&#xff0c;满足cx∣a∣cy∣b∣cx|a|cy|b|cx∣a∣cy∣b∣ 。对于没在a,ba,ba,b序列中的数&#xff0c;可以通过恰当放置使其不对前缀最大…

并发编程- synchronized,Lock及volatile的使用

文章目录并发编程的可见性问题解决方法synchronizedLockvolatile并发编程的可见性问题 多线程访问共享变量&#xff0c;造成线程不安全&#xff0c;最后的数值不对 public class VDemo {private static int num 0;public static void add() {num;}public static void main(St…

红队内网渗透神器--CobaltStrike安装教程

CobaltStrike介绍&#xff1a; CobaltStrike是一款渗透测试神器&#xff0c;被业界人称为CS神器。CobaltStrike分为客户端与服务端&#xff0c;服务端是一个&#xff0c;客户端可以有多个&#xff0c;可被团队进行分布式协团操作。 CobaltStrike集成了端口转发、服务扫描&…

Ubuntu 手动配置DNS

使用ping命令测试百度域名时发现&#xff0c;无法解析这个域名&#xff0c;说明当前系统上没有配置DNS服务器。配置DNS服务器的方式主要有以下两种&#xff1a; 目录 1、修改DNS配置文件 /etc/resolv.conf 2、修改网卡配置文件 /etc/network/interfaces 1、修改DNS配置文件 /e…

【附源码】计算机毕业设计JAVA宠物云寄养系统

【附源码】计算机毕业设计JAVA宠物云寄养系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA myba…

Vue3 - toRef() 使用教程

介绍 它可用于为响应式对象上的 property 创建 ref&#xff0c;这样创建的 ref 与其源 property 保持同步&#xff0c;当改变源 property 时&#xff0c;将更新 ref &#xff0c;反之亦然。 这段话有些晦涩难懂&#xff0c;其实用大白话说&#xff0c;就是当你使用 reactive 创…

如何拆分PDF成单页?这三个方法分享给你

很多朋友在平时的工作中&#xff0c;经常需要处理一些PDF格式的文件&#xff0c;但是如果PDF文件的占用空间太大&#xff0c;难以进行操作处理&#xff0c;这时我们就需要先将其拆分成多个小文件&#xff0c;那你们知道要怎么把PDF拆分成多个文件吗&#xff1f;今天我就来给大家…

RK3568平台开发系列讲解(LCD篇)DRM 显示框架

🚀返回专栏总目录 文章目录 一、DRM 显示框架二、DRM 驱动和 libdrm 交互过程2.1、GEM:2.2、KMS:三、DRM 驱动路径3.1、Uboot驱动路径3.2、内核驱动路径沉淀、分享、成长,让自己和他人都能有所收获!😄 📢DRM 英文名叫 Direct Rendering Manager,用来管理显示输出,图…

App Languages 批量导入管理flutter多语言文案

前段时间AppLanguages推出了iOS、Mac版的多语言文案导入功能&#xff0c;好几个小伙伴点赞&#xff0c;称其为“干货工具”&#xff0c;最近加班加点支持了flutter的多语言文案管理功能。 操作界面 批量导入 1&#xff09;需要选择lib文件夹的路径&#xff0c;方便创建和寻找…

2022年11月华南师范大学自考本科-计算机信息管理课程实验—《数据库系统原理》实践题目

《 计算机信息管理课程实验——数据库系统原理 》课程试卷 答卷提交说明&#xff1a; 在mysql环境下填写SQL命令完成以下实践的题目&#xff0c;并返回执行结果的截图&#xff0c;答卷的答题格式如下&#xff0c;包括三部分&#xff1a;题目&#xff0c;SQL文本代码&#x…

【测试开发面试】6家企业真实面试,最终成功入职外企......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 粉丝小A 测试开发的…