链表(5)

数据结构与算法之链表的5个基本算法 数据结构与算法之链表的5个基本算法必须熟练的5个链表操作1.单链表的反转(Leetcode 206)2. 链表中环形结构的检测(Leetcode 141)3.两个有序链表的合并(Leetcode 21)4.删除链表倒数第n个结点(Leetcode 19)5.链表的中间结点(Leetcode 876) 必须熟练的5个链表操作 一直以来,链表都是数据结构学习中最基础也是最不易学通的一种结构。本文就链表的5个基本算法进行详细的解析,希望对你的链表学习有所帮助。 1.单链表的反转(Leetcode 206) 对于单 阅读详情

一、判断一个链表是否为回文结构

给定一个链表,请判断该链表是否为回文结构。

回文是指该字符串正序逆序完全一致。

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    public boolean isPail (ListNode head) {
        if (head == null) return true;

        // 快慢指针找中点
        ListNode slow = head, fast = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        // 反转后半段
        ListNode pre = null;
        ListNode cur = slow.next;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }

        // 比较
        while (pre != null) {
            if (pre.val != head.val) return false;
            pre = pre.next;
            head = head.next;
        }
        return true;
    }
}

运行结果

二、链表的奇偶重排

给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。

注意是节点的编号而非节点的数值。

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode oddEvenList (ListNode head) {
        ListNode oddDummy = new ListNode(-1), evenDummy = new ListNode(-1);
        ListNode oddTail = oddDummy, evenTail = evenDummy;
        boolean isOdd = true;
        ListNode cur = head;
        while (cur != null) {
            if (isOdd) {
                oddTail.next = cur;
                oddTail = cur;
                cur = cur.next;
                oddTail.next = null;
            } else {
                evenTail.next = cur;
                evenTail = cur;
                cur = cur.next;
                evenTail.next = null;
            }
            isOdd = !isOdd;
        }
        oddTail.next = evenDummy.next;
        return oddDummy.next;
    }
}

运行结果

三、删除有序链表中重复的元素(1)

删除给出链表中的重复元素(链表中元素从小到大有序),使链表中的所有元素都只出现一次
例如:
给出的链表为1→1→2,返回1→2.
给出的链表为1→1→2→3→3,返回1→2→3.

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) {
        if (head == null) return head;
        // 有序链表若有重复元素,则它们是相邻的
        // 我们从 head 出发,记作 cur
        // 若 cur 有下一个节点,我们进行如下的分类讨论:
        // Ⅰ cur.val == cur.next.val:cur.next 是重复元素,移除它。
        // Ⅱ cur.val != cur.next.val:cur.val 不存在重复元素,cur 后移一位
        ListNode cur = head;
        while (cur.next != null) {
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }
        return head;
    }
}

运行结果

四、删除有序链表中重复的元素(2)

给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.

数据范围:链表长度 0≤n≤10000,链表中的值满足 ∣val∣≤1000

要求:空间复杂度 O(n),时间复杂度 O(n)

进阶:空间复杂度 O(1),时间复杂度 O(n)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) {
        // head 处可能会被删除,因此需要引入 dummy 节点来简化处理
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        // 基于有序链表,重复元素相邻的特性,我们可以采取两两比较的方式找出值重复的元素
        // 我们从 dummy 出发,记作 cur
        // 然后两两比较其下一个节点和下下个节点的值(若都存在的话)
        // 若二者相等,说明当前值是重复的,因此将其全部删除。
        // 否则,cur.next.val 是不重复的,其作为下一组值的前驱节点。
        ListNode cur = dummy;
        while (cur.next != null && cur.next.next != null) {
            if (cur.next.val == cur.next.next.val) {
                int duplicatedVal = cur.next.val;
                while (cur.next != null && cur.next.val == duplicatedVal) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}

运行结果

LeetCode-5:实现链表的首尾链接 题目 将给定的单链表L: L 0→L 1→…→L n-1→L n, 重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→… 要求使用原地算法,并且不改变节点的值 例如: 对于给定的单链表{1,2,3,4},将其重新排序为{1,4,2,3}. Given a singly linked list L: L 0→L 1→…→L n-1→L n, reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→… You must do this in-place wi 阅读详情

相关推荐

3-5 单链表分段逆转 pta

3-5 单链表分段逆转 (20分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4;如果 K=4,则应该得到 4→3→2→1→5→6。 函数接口定义: void K_Reverse( List L, int K ); 其中List结构定义如下: typedef struct Node PtrToNode; struct Node { ElementType Data; / 存储结点数据

m0_46314516的博客 2437

Vue 3.5 双向链表如何实现依赖收集

安装响应式系统包, 核心代码如下所示,通过 debugger 直接进入reactivity包调试jsx代码解读复制代码。

weixin_47588164的博客 1438

3-5 单链表分段逆转 (20 分)

给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4;如果 K=4,则应该得到 4→3→2→1→5→6。 函数接口定义: void K_Reverse( List L, int K ); 其中List结构定义如下: typedef struct Node *PtrToNode;...

BQDQSZ的博客 3001

PTA 7-5 重排链表 (25 分)

PTA 7-5 重排链表 (25 分) #include <iostream> #include <iomanip> using namespace std; int main() { int a[100000][3],b[2],d[100000],adress,number,link,t,i,c=0; for(int i=0;i<2;i++) ...

weixin_44996854的博客 3701

记录汇川:自由口通信-梯形图

最常见的就是MODBUS通信协议,指令主要通过RS232和RS485端口进行报文发送,所以通信报文格式可以选择MODBUS RTU通信格式或MODBUS ASCII通信格式。255---Y10-Y17:ON(1111 1111)指令进行报文的发送与接收,但是报文内部的数据格式不是由主站PLC决定, 而是由。修改从站一个保持寄存器数据。修改从站多个保持寄存器数据。读取从站的输出信号状态。读取从站的输入信号状态。读取从站保持寄存器数据。读取从站输入寄存器数据。

m0_61837027的博客 4914

LiveKit 本地部署实战:从零搭建安全实时通信环境(Caddy+HTTPS)

本文详细介绍了如何从零开始搭建LiveKit本地部署环境,结合Caddy服务器实现HTTPS安全通信。通过环境准备、证书生成、服务配置到前端客户端集成的完整流程,帮助开发者快速构建实时音视频应用,特别适合需要安全实时通信的场景。

weixin_29227585的博客 679

牛客: BM5 合并k个已排序的链表

合并链表数组中的前两条链表,直到链表数组的长度为一, 返回这个唯一的链表。

https://github.com/cv70 1402

计算机网络-自顶向下方法 第三章课后习题答案(第七版)

复习题 R1. a) 就叫这个协议为简单传输协议STP(Simple Transport Protocol)。在发送方,STP从发送进程接收不超过1196字节的数据块、目标主机地址和目标端口号。STP向每个块添加一个4字节的头,并将目标进程的端口号放在头中。STP然后将目标主机地址和结果段提供给网络层。网络层将段交付给目的地主机的STP。目的主机基于STP检查段中的端口号,从段中提取数据,并将数据传递给由端口号标识的进程。 b) 在发送方,STP从发送进程接收不超过1192字节的数据块、目标主机地址和目标端

Erekilu的博客 2万+

使用ES5,ES6实现链表数据结构

1.链表介绍 1.存储多个元素最常用的数据结构是数组,数组有一个缺点, (大多数语言中)数组的大小是固定的,从数组的起点或中间插入或移除项成本很高, 需要移动元素(我们所学的JavaScript有来自Array类的方法可以帮我们做这些事,但背后的情况同样如此) 2.链表存储有序的元素集合,不同于数组,链表中的元素在内存中并不是连续放置的,每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成 3.链表类似于火车头,一节车厢载着乘客(数据),通过节点连接另一节车厢 head属

yangaoyuan1999的博客 1409

GIS常用符号化色带(超级色带)根据python制作

GIS自带的色带比较单一,今天分享一款色带,应用之后大家出图的时候可以选择更多的配色,符号化/点击色块/样式引用/将样式添加至列表即可。色带类型比较多,大家可以自己尝试下不同的风格。简单符号化一下,看看效果。以中国县级行政区划为例,

J_Giser的博客 2638

Test软件:Keysight二次开发_(3).安装与配置开发环境

在开始进行Keysight软件的二次开发之前,首先需要确保您的开发环境已经正确安装和配置。本节将详细介绍如何安装和配置必要的开发工具和依赖项,以便您能够顺利进行开发工作。

2401_87715305的博客 1413

GESP5级C++考试语法知识(七、链表(二)双链表)

GESP5级C++考试语法知识(七、链表(二)双链表)

汉克老师的博客 485

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践

本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。

m0_67505153的博客 1268

链表之5个常见的链表操作

单链表翻转 链表中环的检测 两个有序的链表合并 删除链表倒数第n个节点 求链表的中间节点

wjavadog的博客 172

回归预测 | MATLAB实现MPR多元多项式回归

回归预测 | MATLAB实现MPR多元多项式回归

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1645

7.6 GPU页表更新机制

本文分析了AMDGPU驱动中BO到VA映射的页表更新实现机制。核心流程通过amdgpu_vm_bo_update()函数触发,支持CPU直接写入和SDMA异步命令两种更新模式。系统根据VRAM可见性自动选择最优更新策略,处理三种主要场景:命令提交、BO迁移和BO销毁。关键实现包括DMA地址数组处理、权限标志合并和BO迁移状态转换,最终通过amdgpu_vm_update_range()完成硬件页表更新。该机制有效平衡了更新延迟与吞吐量,为GPU虚拟内存管理提供基础支撑。

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

习题2.5 两个有序链表序列的合并 (15分)

习题2.5 两个有序链表序列的合并 (15分) List Merge( List L1, List L2 ) { List t,a=L1->Next,b=L2->Next,c,L; L=(List)malloc(sizeof(List)); c=L; while(a&&b) { if(a->Data>=...

菜鸟更要继续努力的博客 591

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

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

PAT-2019年秋季考试-乙级 7-5 链表合并

7-5 链表合并 这个题真的真的真的。。。乙级题库里链表的题我觉得比这道难 坑的话 我觉得就是先要判断l1 和 l2谁长(我第一次提交就没判断。。,好像就一个测试点是1比2长。。) 之后就是reverse函数 这个《算法笔记》里有。。我都用好几个月了。。。 最后就是地址要5位数输出%05d 没啦 甲级见 #include<stdio.h> #include<algorithm&g...

weixin_41635596的博客 408

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Redis 5.0源码学习(一)—— 双向链表

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

u014028907的博客 179

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

BM5 合并k个已排序的链表

合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 数据范围:节点总数 0≤n≤5000,每个节点的val满足 ∣val∣

伍六琪的博客 455

Leetcode 链表题5

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例 2: 输入: 1->1->1->2->3 输出: 2->3 /** * Definition for singly-linked list. ...

m0_37834993的博客 228

链表翻转。比如给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5

链表翻转 题目:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型。 算法思想: 这个题是链表逆置的升级变型,我们可以将此链表先按照以k为

step_ma的博客 1042

GESP5级C++考试语法知识(六、链表(一)单链表)

GESP5级C++考试语法知识(六、链表(一)单链表) 🌟《链表10道经典练习题》🌟

汉克老师的博客 559

5、链表

数组在存储结构上的弊端: 数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个100MB大小的数组,当内存中没有连续的,足够大的存储空间时,即便内存的剩余总可用空间大于100MB,仍然会申请失败。 链表的内存结构? 链表不需要一块连续的内存空间,它通过”指针”将一组零散的内存块串联起来使用,所以如果我们申请的是100MB大小的链表,根本不会有问题 单链表 两个特殊结点: 头结点用...

qq_36000403的博客 410

检测链表中的循环 java的5种方法

时间复杂度:O(N),循环只需要遍历一次。 辅助空间:O(1)。

weixin_45428910的博客 2081

sdut 链表5

7-5 sdut-C语言实验-链表的逆置分数 20全屏浏览切换布局作者 马新娟单位 山东理工大学输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据。

2302_80130040的博客 654
上一篇: 链表(4)
下一篇: 二分查找/排序
w_zero_one
博客等级 码龄2年 149粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值