每天一道算法题--单链表的相关操作

单链表 简单题(单链表基本操作) 题目描述: 有一个带头结点的单链表L=(a1,b1,a2,b2,......an,bn),设计一个算法将其拆分成两个带头结点的单链表L1和L2,其中L1=(a1,a2,a3...an),L2=(b1,b2,b3....bn),要求L1使用L的头结点。 解题思路: 利用原单链表L中的所有节点通过改变指针域重组成两个单链表L1和L2,由于L1中节点的相对顺序与L中的相同,所以采用尾插法建立单链表... 阅读详情

单链表在笔试面试中属于重点考察对象,这里总结几个常考的单链表操作。

//构造链表结构
    static class ListNode {
          int val;
          ListNode next;
          ListNode(int x) { val = x; }
    }
  • 删除单链表中的某一结点(不是从前一节点删除后一节点)
    这里写图片描述

删除节点,此时这里给出的节点正是将删除节点,而且是单链表(注意尾节点的处理)
这里是是下一个节点的值直接付给要删除的节点,然后删除下一个节点即可


     public static void deleteNode(ListNode node) {
            if(node.next==null){
                node=null;
             }else{
                 node.val=node.next.val;
                 node.next=node.next.next; 
             }
     }
  • 删除链表中值为val的节点

删除值为val的节点,一般遇到这种要注意头节点是否会改变年,如果改变需要将头节点先储存起来

public static ListNode removeElements(ListNode head, int val) {
         if(head==null) return null;
         ListNode node=head;
         //先判断下一个节点是否为空
         while(node.next!=null){
             if(node.next.val==val){
                 node.next=node.next.next;
             }else{
                 //注意这里替换使用当前结点替换下一个节点
                 node=node.next;
             }
         }
        //把头节点放到最后一个判断
         if(head.val==val){
             head=head.next;
         }
         return head;

    }
  • 删除链表中倒数第n个节点

因为在链表长度是不可知的,因此可以多创建一个指针来进行标记。即当一个指针只想被删除节点时,另外一个指针指向最后一个节点,期间相距n-1个节点。 但实际上这里设计的时候使两个指针相隔n个节点,以便通过前节点将后节点删除,而且注意这里可能会改变头节点,因此要保留头节点

 public static ListNode removeNthFromEnd(ListNode head, int n) {
         if(head==null) return null;
          ListNode dummy = new ListNode(0);
          dummy.next = head;
          ListNode lastNode = dummy;
          ListNode headNode = dummy;
          for (int i = 1; i <= n + 1; i++) {
              lastNode = lastNode.next;
            }
            while (lastNode != null) {
                lastNode = lastNode.next;
                headNode = headNode.next;
            }
            headNode.next = headNode.next.next;
            return dummy.next;

     }
  • 在有序链表中删除重复的节点,但保留第一个重复的点

两个相邻的指针同时出发,当值不同时,都往前移动,当值相同时,则前指针不移动,后指针移动(腾讯有一道笔试题与此类似:找出红包金额出线数过半的金额数)

 public static  ListNode deleteDuplicates(ListNode head) {
         if(head==null) return null;
         ListNode lastNode =head.next;
         ListNode headNode =head;
         while(lastNode!=null){
             if(headNode.val==lastNode.val){
                 lastNode=lastNode.next;
                 headNode.next=lastNode;
             }else{
                 headNode=headNode.next;
                 lastNode=lastNode.next;
             }
         }
         return head;
     }

以上这道题有一道变形题,在有序链表中删除节点,但是所有重复节点都不保留,因此可能会改变头节点,因此需要对头节点进行数据备份

public static ListNode deleteDuplicates2(ListNode head) {
         if(head==null) return null;
         ListNode dummy = new ListNode(-1);
         dummy.next = head;
         ListNode lastNode =dummy.next;
         ListNode headNode =dummy;
         //全都是对下一个数据进行比较
         while(lastNode.next!=null){
             if(lastNode.next.val==headNode.next.val){
                 //比如链表如右:1,2,3,4,4,4,4,5,6,7,出现重复后,headNode停在第一个4的位置前面,下一个指针遍历到最后一个4的位置上
                 //在改变头节点时,尤其是已经有其他节点保存了头节点,需要借助指针的方式来改变,不可以改变内存地址的形式实现
                //如果下一个节点还是值相等,则往后移一个节点
                 while(lastNode.next.val==headNode.next.val&&lastNode.next.next!=null&&lastNode.next.next.val==headNode.next.val){
                     lastNode=lastNode.next;
                 }
                 //这里要删除中间相同的n多个节点,此时headNode停在第一个4的位置前面(3),下一个指针遍历到最后一个4的位置上
                 //注意要把两个节点所在的节点一起删去
                 if(lastNode.next.next!=null){
                     headNode.next=lastNode.next.next;
                     if(lastNode.next.next.next!=null){
                         lastNode.next=lastNode.next.next.next;
                     }else{
                         lastNode.next=null;
                     }
                 }else{
                     lastNode.next=null;
                     headNode.next=lastNode.next;
                 }
             }else{
                 headNode=headNode.next;
                 lastNode=lastNode.next;
             }
         }
         return dummy.next;
     }
MoveIt2 Servo实战:解锁UR机械臂在ROS2中的实时遥操作与动态响应 本文深入探讨了MoveIt2 Servo在UR机械臂实时遥操作中的应用,展示了如何通过ROS2实现毫秒级动态响应。文章详细解析了Servo的核心价值、环境配置、控制器适配及高级调优技巧,特别适用于需要高精度控制的工业场景,如VR手术训练和汽车装配线。 阅读详情

相关推荐

STM32与SD卡SPI接口硬件设计:从原理图到调试的完整指南

SPI(串行外设接口)作为一种广泛应用的同步串行通信协议,以其接线简单、驱动成熟的特点,成为连接微控制器与各类外设的经典方案。其工作原理基于主从架构,通过时钟、数据线和片选信号实现全双工通信,在嵌入式系统中具有极高的技术价值,常用于连接传感器、存储设备和显示模块等。在数据存储场景中,SD卡凭借其大容量和便携性成为首选,而通过SPI模式驱动SD卡,则平衡了性能与设计复杂度。本文聚焦于使用Altium Designer进行硬件设计的工程实践,详细解析了STM32微控制器与SD卡通过SPI通信时,电源管理、上拉电

weixin_34101784的博客 555

单链表的基本操作之部分习题的讲解

单链表的基本操作之习题篇 1、有一个线性表(a1,a2,a3,…an),n>=2,采用带头结点的单链表L存储,设计一个算法将其就地逆置,空间复杂度为O(1) 解题思路1: ​ 用指针p遍历原单链表,先将头节点L的next域置为NULL而变成一个空链表,然后节点采用头插法插入L中。 示例图: 对应算法如下: void ReverseLinkList(LinkList& L) { LNode* p = L->next, * q; L->next = NULL; //将L

weixin_56169816的博客 1693

Selenium自动化测试遇到shadow-root元素?3种实用解决方案帮你搞定

本文针对Selenium自动化测试中遇到shadow-root元素难以定位的常见问题,提供了三种实用的解决方案。详细阐述了通过JavaScript直接穿透Shadow DOM、利用浏览器工具快速获取JS Path以及使用Python第三方库进行优雅封装的方法,并分享了提升脚本健壮性的实战策略与最佳实践,帮助测试人员有效应对现代Web组件化开发带来的挑战。

code8的博客 408

链表算法一之单链表基本操作

这一节介绍另外一种数据结构

山之巅的专栏 1262

STM32电机库(ST-MC-Workbench)实战指南——三电阻电流采样电路参数配置详解

本文详细解析了STM32电机库(ST-MC-Workbench)中三电阻电流采样电路的参数配置方法,涵盖电阻选型、放大增益计算、滤波时间优化等关键步骤。通过实战案例和调试技巧,帮助工程师快速掌握电流采样技术,提升电机控制系统的精度与稳定性。特别针对ST-MC-Workbench界面参数设置提供了详细指导。

weixin_29186249的博客 505

GD32F303开发实战(一):从零搭建MDK工程与时钟配置详解

本文详细介绍了如何从零开始为GD32F303微控制器搭建一个清晰、可维护的MDK工程模板。内容涵盖开发环境准备、工程目录结构规划、文件分组管理、关键工程配置,并重点解析了时钟树原理,手把手指导配置108MHz系统时钟。通过实战步骤与常见问题排查,帮助开发者构建一个稳定可靠的开发基础,便于后续功能扩展。

weixin_29174141的博客 270

单链表的基本操作(面试题)

单链表的基本操作(面试题)

Meliorem的博客 637

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。

charce_you的专栏 914

每天一道算法题系列十八之删除链表的倒数第N个节点

每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。 本题难度是中等 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2-

qq_38091343的博客 191

基于STM32设计的物联网疫苗冷链物流监测系统

本设计基于物联网技术,开发了一套疫苗冷链物流环境监测系统。系统采用STM32F103C8T6作为主控芯片,集成SHT30温湿度传感器、震动传感器、GPS定位模块和4G通信模块,实现对运输环境的温度、湿度及震动状况的实时监测与控制。通过继电器驱动半导体制冷模块和加湿器,系统能够自动调节环境温湿度,保障疫苗运输的安全性。采集的环境数据通过MQTT协议上传至华为云物联网平台,配套开发的Android手机APP和Windows上位机软件基于Qt平台设计,支持远程实时查看环境数据和车辆定位,提升了疫苗冷链运输的智能化

863

petalinux2022.2启动文件编译配置

petalinux2021之前的版本里,导入目录components/yocto/下的“environment-setup-aarch64-xilinx-linux” 和 “layers/core/oe-init-build-env”的环境,能使用Yocto的devtool工具。(加入下面内容,先petalinux-build下载完成后才能有源码)制作 BOOT.BIN 启动文件:petalinux-package --boot --fsbl --fpga --u-boot --force。

wangjie36的博客 1390

每天一道算法题系列三之两数相加

每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/add-two-numbers/submissions/ 来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。 /*** * 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 * 的方式存储的,并且它们的每个节点只能存储 一位 数字。 * * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 *

qq_38091343的博客 288

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1859

每天一道LeetCode-----判断链表是否有环,如果有,找到环的入口位置

每天一道LeetCode-----判断链表是否有环,如果有,找到环的入口位置

zou_albert的博客 249

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

如何用1024道AI算法题打通求职任督二脉:一线专家亲授刷题心法

掌握AI算法面试核心方法,高效突破技术关卡。依托「AI算法题1024道:面试必刷清单」,覆盖大厂高频考点,结合一线专家解题心法,系统提升刷题效率与代码实战能力。适用于秋招、跳槽等场景,精准攻克难点痛点,值得收藏。

CompiGap的博客 680

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

二叉排序树与文件操作的设计与实现_630页!熬夜整理出的“高分宝典”:算法+数据结构+网络+操作系统...

欢迎关注专栏【以架构赢天下】——每天持续分享Java相关知识点以架构赢天下​zhuanlan.zhihu.com以架构赢天下——持续分享Java相关知识点每篇文章首发此专栏欢迎各路Java程序员关注及投稿干货资料大派送<Java相关资料分享>分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,...

weixin_39705193的博客 132

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

字节一面凉经

经过40多分钟的一面,我的暑假实习计划彻底泡汤,不过我也没气馁,至少我知道了接下来最要紧的事情是什么。 40多分钟的面试,工程项目一点也没问,全是问计算机底层基础。主要在三块——多线程,数据结构,操作系统。外加一道简单的算法题。 多线程:他这块问的是最深的,问到了“synchronized关键字的底层原理是什么?”,这块我答得是最乱的,很多问题我不知道该如何去答(多线程也是最近才开始接触的,面试前一天看过一些相关的文章) 数据结构:这块我答得还可以,他也没问的很深,大概就问了几个数据结构的原理和概念 操作系

风过孤屿,山海自成诗行。 2745

算法相关问题记录

本文总结了18个经典算法问题的解题思路,涵盖数组、链表、树、动态规划等数据结构与算法。主要内容包括:1)两数之和、反转链表等基础问题;2)二叉树遍历、最长公共子序列等中级问题;3)背包问题、全排列等高级问题。每种问题都提供了核心解决方法和关键代码片段,如哈希表用于两数之和、动态规划处理最长递增子序列等。这些题目覆盖了秋招面试常见考点,理解其解法并掌握背后的算法思想对准备技术面试至关重要。

m0_74727447的博客 1372

宇通客车底盘工程师岗每天工作八小时,双休还有高温假和超长年假

华为,世界500强,每年研发投入全球TOP5,平台大、待遇优、机会多;#美团# 团子效率真高,上周末笔试这周就面了========================面试官人很好,很给面子,希望能有二面互相自我介绍开场介绍了一下项目八。公司:小米 岗位:产品经理 状态:已经实习三个多月啦工作内容:分配给你的任务就很琐碎,每天的任务都很重复,觉得没有一点挑战性,甚至有点精神内耗。

2301_79125642的博客 237

​LeetCode刷题实战382:链表随机节点

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !...

程序IT圈 117

链表操作精要:从基础到进阶实战

链表是数据结构中的基础类型,通过指针连接节点实现动态存储。其核心原理在于节点间的引用关系,相比数组具有更灵活的内存管理能力。在技术价值上,链表操作能培养对指针和内存的深刻理解,是算法面试的必考内容。实际应用场景广泛,包括内存管理、文件系统、哈希表冲突解决等。本文重点解析两两交换节点、删除倒数第N个节点等经典问题,通过快慢指针等技巧展示链表操作的精华。其中虚拟头节点(dummy node)和递归转迭代的优化方法尤为实用,能有效提升代码质量和执行效率。

weixin_34275734的博客 746
上一篇: 每天一道算法题--最长公共子序列和最长公共子串
下一篇: Mysql的执行顺序
yadicoco49
博客等级 码龄10年 6粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值