链表增删操作问题及解决方法

news2024/11/18 3:44:17

目录

  • 链表增加元素
    • 首部
    • 中间
    • 尾部
  • 链表删除元素
    • 首部
    • 中间
    • 尾部

链表是一种常用的数据结构,用于存储和组织数据。在链表中,增加和删除元素是常见的操作。然而,在进行链表的增删操作时,对于首部、中间和尾部位置的元素,都存在一些问题需要解决。

链表增加元素

首部

当需要在首部插入一个新的元素时,需要将该元素的引用指向原本的首部节点,并将链表的头引用指向新的元素。这样做会花费O(1)的时间,即常量时间,因为只需要修改两个引用的指向。

中间

当需要在链表中间插入一个元素时,需要先找到插入位置的前一个节点,然后通过修改引用来插入新的节点。这个过程需要花费O(n)的时间,其中n是链表的长度。
需要注意的是修改引用的顺序不能颠倒。
在这里插入图片描述

尾部

链表的尾部是指链表中的最后一个节点。当需要在尾部插入一个新的元素时,只需要找到尾部节点,并将其引用指向新的元素。这样做同样花费O(n)的时间,因为需要遍历整个链表找到尾部节点。

代码演示:

    public static Node insert(Node head, Node nodeInsert, int position) {
        //判断链表是否为空,如果为空,则直接返回新节点作为头节点
         if(head== null){
             return nodeInsert;
         }
         //链表元素个数
         int size = getLength(head);
         //检查插入位置是否合法
         if(position > size+1 ||  position<1){
             System.out.println("插入位置不合法");
             return head;
         }
        //如果插入位置为1,将新节点的next指针指向原头节点,然后将新节点作为新的头节点返回。
         if(position == 1){
             nodeInsert.next = head;
             head = nodeInsert;
             return head;
         } else {
             Node node = head;
            // 遍历链表,找到插入位置的前一个节点(node),将新节点的next指针指向该节点的next指针,然后将该节点的next指针指向新节点
             for (int i = 1; i < position - 1; i++) {
                 node=node.next;
             }
             nodeInsert.next = node.next;
             node.next = nodeInsert;
             return head;
         }
    }

链表删除元素

首部

删除首部元素时,情况会稍微复杂一些。需要将链表的头节点引用指向原本首部的下一个节点,并释放原本的首部节点。这同样需要花费O(1)的时间,而不会受到链表长度的影响。

中间

在删除链表中部的元素时,同样需要先找到要删除的节点的前一个节点,然后将其引用指向要删除节点的下一个节点,然后释放要删除的节点。这个过程同样需要花费O(n)的时间。
在这里插入图片描述

尾部

删除链表尾部的元素时,同样需要遍历整个链表找到尾部节点的前一个节点,并将其引用指向null。这个过程同样需花费O(n)的时间。

代码演示:

    public static Node deletNode(Node head, int position){
        //判断链表是否为空,如果为空则直接返回null。
       if(head == null){
           return null;
       }
       int size = getLength(head);
       //判断要删除的位置position是否合法,即大于链表长度或小于1
       if(position> size ||  position < 1){
           System.out.println("删除位置不合法");
           return head;
       }
       //如果要删除的位置position为1,说明要删除的是头节点,直接返回头节点的下一个节点作为新的头节点。
       if(position == 1){
         return head.next;

       } else {
         Node node = head;
           for (int i = 1; i < position -1 ; i++) {
               node = node.next;
           }
           node.next = node.next.next;
           return head;
       }
    }

综上所述,链表的增删操作在首部、中间和尾部位置都会存在一些问题,时间复杂度也有所不同。为了解决这些问题,我们可以在实际应用中采取一些优化措施,比如使用双向链表,可以加快在中间和尾部进行插入和删除操作的速度。此外,还想了解更多可查阅我的专栏。

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

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

相关文章

UWB安全数据通讯STS-加密、身份认证

DW3000系列才能支持UWB安全数据通讯&#xff0c;DW1000不支持 IEEE 802.15.4a没有数据通讯安全保护机制&#xff0c;IEEE 802.15.4z中指定的扩展得到增强&#xff08;在PHY/RF级别&#xff09;&#xff1a;增添了一个重要特性“扰频时间戳序列&#xff08;STS&#xff09;”&a…

mysql修改root用户的密码

mysql修改root用户的密码 方法1&#xff1a; 用SET PASSWORD命令方法2&#xff1a;用mysqladmin方法3&#xff1a;用UPDATE直接编辑user表方法4&#xff1a;在忘记root密码的时候&#xff0c;可以这样以windows为例&#xff1a; 连接mysql问题 mysql备份工具之mysqldump 方法1&…

反转链表(java)

大家好我是苏麟今天说一说链表常见的简单题目 . BM1 反转链表 牛客BM1 反转链表 : 描述 : 给定一个单链表的头结点(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 分析 : …

AP5101C 高压线性恒流 LED电源驱动IC 3D打印机显示灯驱动器

1&#xff0c;产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度…

3. 实战入门

3. 实战入门 文章目录 3. 实战入门3.1 Namespace3.1.1测试两个不同的名称空间之间的 Pod 是否连通性 3.2 Pod3.3 Label3.4 Deployment3.5 Service 本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 3.1 Namespace Namespace是kubernet…

IDEA使用内置database数据库连接mysql报错:javax.net.ssl.SSLHandshakeException

参考一些博客的方式&#xff1a; 使用idea内置database连接数据库报错javax.net.ssl.SSLHandshakeException: No appropriate protocol_idea database ssl_你当像山的博客-CSDN博客 他们的方式是&#xff1a;在url后添加useSSLfalse 介绍另外一种方式&#xff1a; 点击datab…

大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求

大规模语言LLaVA&#xff1a;多模态GPT-4智能助手&#xff0c;融合语言与视觉&#xff0c;满足用户复杂需求 一个面向多模式GPT-4级别能力构建的助手。它结合了自然语言处理和计算机视觉&#xff0c;为用户提供了强大的多模式交互和理解。LLaVA旨在更深入地理解和处理语言和视…

小程序setData动态传递key

有些时候可能需要根据key是个变量 比如 let keyName "name" this.setData({keyName :"张三" })本来想将keyName替换为name的&#xff0c;但是小程序只会在data中定义一个key为keyName ,value为“张三”的一条数据。 正确写法为&#xff1a; let keyNam…

SS626V100_SDK_V2.0.1.0 安装编译 osdrv 问题汇总

目录 前言1、开发环境2、在 linux 服务器上安装交叉工具链2.1 安装 aarch64-mix410-linux.tgz2.2 安装 cc-riscv32-cfg11-musl-20220523-elf.tar.gz2.3 检查工具链版本&#xff0c;打印版本则表示配置成功 3、安装 SDK3.1 SS626V100_SDK_V2.0.1.0 安装包位置3.2 解压缩并展开 S…

怎么把图片改成jpg格式?

怎么把图片改成jpg格式&#xff1f;大家都知道&#xff0c;随着计算机被发明到现在已经存在了很多年&#xff0c;在这么多的的技术发展过程中&#xff0c;也形成了种类非常多的图片文件格式&#xff0c;例如平时我们能接触到的图片格式有jpg、png、gif、bmp、heic、tiff、jfif、…

力扣-python-两数之和

题解&#xff1a; class Solution(object):def twoSum(self, nums, target):# 遍历列表for i in range(len(nums)):# 计算需要找到的下一个目标数字res target-nums[i]# 遍历剩下的元素&#xff0c;查找是否存在该数字if res in nums[i1:]:# 若存在&#xff0c;返回答案。这里…

云安全—云计算架构

0x00 前言 云中的所有的软件都是作为服务来提供的&#xff0c;需要支持多租户&#xff0c;需要提供伸缩的能力&#xff0c;所有需要特定的软件架构来进行支持。 0x01 云计算的本质 1.云计算系统工程 主要特点是&#xff1a; 弹性透明模块化通用动态多租赁 云计算通过对硬…

基于JavaWeb+SpringBoot+Vue健身俱乐部系统的设计和实现

基于JavaWebSpringBootVue健身俱乐部系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 1.1 课题背景 随着互联网的发展&#xff0c;电脑已成为人们生活中必不可少的生活办公工…

asyncawait函数

一种更简洁的方式写出基于Promise的异步行为 async函数的返回值为一个promise&#xff0c;通过then和catch来捕获内部的返回值 1.特性: 1. async函数内部会返回一个promise对象&#xff0c;如果看起来不是promise&#xff0c;那么它将会隐式的包装在promise中&#xff08;如…

保姆级VitrualBox下载ubantu

首先先到此处下载VitrualBox选择对应的配置 Oracle VM VirtualBox 下载VitrualBox的同时要下载一个Visual&#xff0c;支持VitrualBox运行 最新受支持的 Visual C 可再发行程序包下载 | Microsoft Learn 同时再根据下面的网址去下载Ubantu 下载好后桌面出现这两个&#xff0c…

从培训班出来之后找工作的经历,教会了我五件事.....

我是非计算机专业&#xff0c;由于专业不好实习急着就业有过一些失败的工作经历后&#xff0c;跑去参加培训进入IT这行的。 之前在报名学习软件测试之前我也很纠结&#xff0c;不知道怎么选择机构。后面看到有同学在知乎上分享自己的学习经历&#xff0c;当时对我的帮助很大。…

从手动操作到自动化管理,如何实现企业身份业务全面自动化?

在数字化时代&#xff0c;身份管理已经成为了企业和组织不可或缺的一部分&#xff0c;企业对于管理员工、客户和合作伙伴的身份信息和访问权限的需求变得愈发复杂。身份管理不仅仅是一项必要的任务&#xff0c;更是确保业务流畅运营和数据安全的关键因素。然而&#xff0c;传统…

Restful 风格

目录 Restful风格创建springboot项目SpringMVC开发Restful接口1、获取所有的员工思路代码RequestMappingGetMapping 2、获取单个员工思路代码注意&#xff1a; 3、删除员工数据思路&#xff1a;代码单个删除批量删除 4、更新员工数据思路&#xff1a; 5、jQuery发送请求发送del…

应该继续学习编程,还是学数控?

今日话题&#xff0c;继续学习编程&#xff0c;还是学数控&#xff1f;综合来说肯定是软件的待遇和工作环境都要好些。 当然这行有一定的技术门槛&#xff0c;所谓会者不难&#xff0c;难者不会。要入门需要一定的天赋或者说时间&#xff0c;当然 兴趣是最好的老师&#xff0c;…