双向链表的基本结构及功能实现

news2024/9/25 4:54:39

1.基本结构:

双向链表是一种链表数据结构,它由一系列节点组成,每个节点包含三个部分:

(1).数据域:存储节点的数据

(2).前驱指针:指向前一个节点

(3).后驱指针:指向下一个节点

2.基本特性:

双向链接:   与单向链表不同,双向链表的每个节点都可以向前和向后移动,这使得在链表中插入和删除节点更加灵活。

3.基本操作:

我们要实现的功能:

addFirst(头插) 、 addLast(尾插)、disPlay(展示)、size(数组长度)、contains(是否包含某个元素)、 index(在某个节点处插入某个元素)、remove(移除某个元素)、removeAllKey(移除所有符合元素)、clear(清除所有数据),当然这些方法都要在接口List中都要进行定义。

3.0 双向链表基本结构的实现:

(1).包含基本结构:数据域、前驱指针、后驱指针

(2) 构造方法的实现:每个数据域对应的值输入(整数)

  (3). 头节点、尾节点的定义

具体代码如下:

 static class ListNode{
          public int val;
          public ListNode prev;
          public ListNode next;

          public ListNode(int val){
              this.val = val;
          }
      }
         public  ListNode head; //头节点
         public ListNode last;   //尾节点

3.1 头插方法的实现:

1.创建一个node 节点

2.判断头节点是否为空(链表是否为空),为空的话,将头尾节点均置为空。

3. 插入元素:将node.next = head, head.prev = node    

head = node;(更新头节点)

具体代码如下:

 public void addFirst(int data) {
           ListNode node = new ListNode(data);
           if(head == null)
           {
               head = last = null;
           }else{
               node.next = head;
               head.prev = node;
               head = node;
        }
    }

3.2 尾插方法的实现:

1.创建一个新节点node储存新元素

2.判断头节点是否为空

3.插入元素:具体代码如下:

@Override
    public void addLast(int data) {
     ListNode node = new ListNode(data);
     if(head == null)
     {
         head = last = null;
     }else{
         last.next = node;
         node.prev = last;
         last = last.next;
     }
    }

3.3 disPlay方法的实现:

1.创建新节点cur 来保存头节点。

2.while循环遍历打印元素,同时更新cur节点

具体代码如下:

 public void disPlay() {
       ListNode cur = head;
       while(cur!=null)
       {
           System.out.println(cur.val);
           cur = cur.next;
       }
        System.out.println();
    }

3.4 size()方法的实现:

1.创建一个保存头节点的cur节点,以及一个用于记录整形的变量len,while循环,每次len++ 并更新cur节点,最后返回len的值。

具体代码如下:

@Override
    public int size() {
        int len = 0;
        ListNode cur = head;
        while(cur!=null)
        {
            len++;
            cur = cur.next;
        }
        return len;
    }

3.5 contains方法的实现:

1.创建一个新节点cur来保存头节点

2.while循环,遍历过程中判断data是否 == cur.val,是的话,返回true,否则返回false,具体代码如下:

public boolean contains(int key) {
             ListNode cur = head;
             while(cur!=null)
             {
                 if(cur.val == key)
                 {
                     return true;
                 }
              cur = cur.next;
             }
             return false;
    }

3.6:index方法的实现:

1.判断给出的index位置是否合理:<0/ >len(链表长度),返回。

2.若index == 0,头插,   index == len,尾插

3.创建findIndex方法,找到位于index位置处的节点。

ListNode cur = head,while循环(index不为0)遍历cur进入下一个节点,同时index自减1,

循环结束返回cur。    具体代码如下:

private ListNode findIndex(int index)
          {
              ListNode cur = head;
              while( index !=0)
              {
                  cur = cur.next; //到达index位置处
                  index--;
              }
              return cur;

          }

4.插入 node节点:

3.7 remove方法的实现:

创建一个cur节点来存储head节点,while循环cur!=null,循环结束cur要更新至下一个节点

1.头删的实现:

2.尾删的情况:

3.中间情况的实现

具体代码实现:

public void remove(int key) {
          ListNode cur = head;
          while(cur!=null)
          {
              if(cur.val == key)
              {
                  if(cur == head)
                  {
                      head = head.next;
                      if(cur!=null)
                      {
                          cur.prev = null;
                      }else{
                          cur.prev.next = cur.next;
                          if(cur.next == null)
                          {
                              last = last.prev;
                          }else{
                              cur.next.prev = cur.prev;
                          }
                      }
                  return ;

                  }
                  cur = cur.next;
              }
          }
    }

3.8 removeAllkey方法的实现:

将remove方法中的return去掉即可,这样消除了一个元素后可以继续遍历循环删除。

3.9 clear方法的实现:

创建新节点cur储存head,while循环遍历链表,设置curN节点为cur的下一个节点,在cur清除当前节点元素后,cur = curN, cur进入下一个位置即curN,进入下一次循环后curN再次后移。

最后,遍历结束后head节点和尾节点要手动置为null。

具体代码如下:

 @Override
    public void clear() {
        ListNode cur = head;
               while(cur!=null){
                ListNode  curN = cur.next;
                   cur.next = null;
                   cur.prev = null;
                   cur = curN;
               }
               head = last = null;
    }
}

今天分享结束,喜欢的老来个三联把!

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

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

相关文章

全球化文创科技产业集团「得力集团」携手企企通,采购数字化项目一阶段上线!

近日&#xff0c;国内最大的办公与学习用品产业集团、多工作场景整体解决方案的领导者「得力集团有限公司」&#xff08;以下简称“得力集团”&#xff09;携手企企通打造的SRM项目一阶段成功上线。 基于该平台&#xff0c;得力集团在供应链采购业务方面实现全流程、全品类、全…

ELK-03-skywalking监控linux系统

文章目录 前言一、下载node_exporter二、启动node_exporter三、下载OpenTelemetry Collector四、启动OpenTelemetry Collector4.1 将配置文件下载到同级目录4.2 启动 五、查看总结 前言 skywalking安装完成后&#xff0c;开始我们的第一个监控-监控linux系统。 参考官方文档&a…

构造者模式多种实现方式

构造者模式 ​ 构造者模式建议将对象构造代码从产品类中抽取出来&#xff0c; 并将其放在一个名为构造者的独立对象中 ​ 构建者模式也是用来创建对象&#xff0c;但是相对于工厂模式来说&#xff0c;建造者模式适用于构建复杂对象&#xff0c;而工厂模式适用于创建对象的封装…

前端框架的对比和选择

在当今的前端开发领域&#xff0c;有多种流行的前端框架可供选择&#xff0c;如 Vue、React 和 Angular。以下是这些框架的对比以及 Vue 的优势&#xff1a; 一、React 特点&#xff1a; 声明式编程&#xff1a;使用 JSX 语法&#xff0c;使得组件的结构和行为更加清晰。虚拟…

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs

代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目&#xff0c;很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…

CentOS 安装 JAVA环境(JDK 1.8)

镜像选择 推荐国内镜像直接下载 清华镜像 https://mirrors.tuna.tsinghua.edu.cn/Adoptium 关于重命名 AdoptOpenJDK 镜像为 Adoptium 的通知 编程宝库 http://www.codebaoku.com/jdk/jdk-index.html 这个镜像站&#xff0c;包含Oracle JDK、OpenJDK、AdoptOpenJDK、阿里…

Lesson1 机器学习_基础介绍(环境配置、入门知识)

Anaconda说明 学习Python的时候&#xff0c;使用者需要耗费时间下载对应的库&#xff08;理解为Python的武器&#xff09;......一家数据公司想让Python的使用更加便利&#xff0c;于是anaconda诞生了anaconda相当于一辆运输车&#xff0c;不仅包含了Python&#xff0c;还附有P…

【Python】数据可视化之点线图

目录 散点图 气泡图 时序图 关系图 散点图 Scatterplot&#xff08;散点图&#xff09;是一种用于展示两个变量之间关系的图表类型。在散点图中&#xff0c;每个观测值&#xff08;或数据点&#xff09;都被表示为一个点&#xff0c;其中横轴&#xff08;X轴&#xff09;代…

MODELS 2024震撼续章:科技与可持续性的未来交响曲

MODELS 2024国际会议正如火如荼地进行着&#xff0c;每一天都充满了新的发现与启迪&#xff0c;每一场分享都是对技术前沿的一次深刻探索&#xff0c;更是对现实世界可持续性挑战的一次积极回应。现在让我们继续这场科技盛宴&#xff0c;看看小编为您精选几场的学术分享吧~ 会议…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第三篇-着色器光照】

在前两篇文章中&#xff0c;我们分别拆解描述了实现原理&#xff0c;并进行了基础的着色器制作。在这一篇文章中&#xff0c;我们将为它实现光照效果 简单的概述 当光线射入体积时&#xff0c;随着光线射入距离的增加&#xff0c;体积中的介质会对光线产生反射和吸收作用&…

springboot 接口接收及响应xml数据

1.实体类 import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement;XmlRootElement XmlAccessorType(XmlAccessType.FIELD) // …

gitlab添加CI自动测试

gitlab 配置 yml 语法 ** https://docs.gitlab.com/17.3/ee/ci/yaml/index.html ** 添加.gitlab-ci.yml文件并配置 &#xff1a; ## 定义几个阶段 stages: # List of stages for jobs, and their order of execution- build- test- deploy- ## 示例job &#xff0…

Linux 简易shell编写

shell shell是壳&#xff0c;外壳的意思&#xff0c;一般我们使用linux系统有用图形化界面的也有使用命令行界面的&#xff0c;这两个都是一种shell&#xff0c;以命令行为例&#xff1a; 如图这个就是我这里的命令行格式&#xff0c;在$符后面写的就是执行的指令&#xff0c;…

携手SelectDB,观测云实现性能与成本的双重飞跃

在刚刚落下帷幕的2024云栖大会上&#xff0c;观测云又一次迎来了全面革新。携手SelectDB&#xff0c;实现了技术的飞跃&#xff0c;这不仅彰显了观测云在监控观测领域的技术实力&#xff0c;也预示着我们可以为全球用户提供更加高效、稳定的数据监测与分析服务。这一技术升级&a…

同等学力英语用什么app背单词

同等学力申硕的意义和作用 授予同等学力人员硕士学位是国家为同等学力人员开辟的获得学位的渠道&#xff0c;对于在职人员业务素质的提高和干部队伍建设起到积极作用。它为那些没有传统学历背景但具有相应学术水平的人员提供了获取学位的机会&#xff0c;有助于提升他们的职业竞…

llamafactory0.9.0微调qwen2.5

llama_factory微调QWen1.5_llama factory qwen-CSDN博客文章浏览阅读2.9k次,点赞36次,收藏10次。本文介绍了如何使用LLaMA-Factory微调Qwen1.5模型,包括1.8B和0.5B版本的训练细节。在数据、训练、LORA融合及推理等方面进行了探讨,同时也分享了微调后模型在不同任务上的表现…

Linux usb主机控制器HC阅读

intel的UHCI 一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver, depends on usb & pci: 它的内核软件模块代码是uhci-hcd.c uhci_hcd_init初始化开始: usb_disable函数:…

408选择题笔记|自用|随笔记录

文章目录 B树&#xff1a;访问节点建堆&#xff01;将结点插入空堆广义指令求每个子网可容纳的主机数量虚拟内存的实现方式文件目录项FCB和文件安全性管理级别索引文件三种存取方式及适用器件成组分解访问磁盘次数 C语言标识符 最小帧长物理传输层介质 局域网&广域网考点总…

基于BeagleBone Black的网页LED控制功能(flask+gpiod)

目录 项目介绍硬件介绍项目设计开发环境功能实现控制LED外设构建Webserver 功能展示项目总结 &#x1f449; 【Funpack3-5】基于BeagleBone Black的网页LED控制功能 &#x1f449; Github: EmbeddedCamerata/BBB_led_flask_web_control 项目介绍 基于 BeagleBoard Black 开发板…

ubuntu 安裝 Poetry 示例

ubuntu 安裝 Poetry 示例 一、前言 poetry 是一个命令行工具&#xff0c;安装之后就可以使用 poetry 指令。可以将其安装全局环境或者是虚拟环境&#xff0c;我推荐安装在全局环境&#xff0c;这样在后面使用时不需要单独激活虚拟环境。 &#xff08;1&#xff09;安装 Poet…