【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)

正如标题所说,本文会图文详细解析三道单链表OJ题,分别为:

  1.  反转链表 (简单)
  2.  链表的中间节点 (简单)
  3.  链表的回文结构 (较难)

把他们放在一起讲的原因是: 反转链表  链表的中间节点  链表的回文结构 的基础

为什么这样说?请往下看:

目录

1. 反转链表

做题思路

画图理解

代码实现

2. 链表的中间节点

做题思路

画图理解

代码实现

3. 链表的回文结构

做题思路

画图理解

代码实现


1. 反转链表

LeetCode链接:206. 反转链表 - 力扣(LeetCode)

💭做题思路

  • 遍历链表,改变每个节点的链接方向,使其链向前节点
  • 如果是第一个节点,使其链向 NULL 

这里需要3个指针:

  •  cur 指向当前需要修改的节点
  •  prev 记录 cur 的前一个节点, cur 要链向此节点
  •  next 记录 cur 的后一个节点,避免 cur 改变链接方向后找不到下个节点

🎨画图理解

✍️代码实现

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* cur = head;
    struct ListNode* prev = NULL;
    while (cur != NULL)
    {
        struct ListNode* next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    return prev;
}

最后提交代码试试:

完美通过,本题并不难,来搞下一题


2. 链表的中间节点

LeetCode链接:876. 链表的中间结点 - 力扣(LeetCode)

💭做题思路

  • 快慢指针
  • 搞两个指针,一个叫 fast ,一个叫 slow 
  • 快指针 fast 一次走两步
  • 慢指针 slow 一次走一步
  • fast 走到 NULL 时, slow 恰好在中间,此时 slow 指向的节点就是中间节点

🎨画图理解

✍️代码实现

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while (fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

提交代码:

这道题也很简单,主要就是快慢指针的思路,第一次接触的话可能想不到这种方法

接下来就是本文重点了,前面这些只是开胃小菜


3. 链表的回文结构

牛客链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

💭做题思路

1. 找到中间节点

2. 反转中间节点及其之后的链表

3. 此时把链表分为两段:

  • 未反转的链表为一段,用指针 list1 指向这段链表的头节点
  • 反转过的链表为另一段,用指针 list2 指向这段链表的头节点

4. 比较 list1 list2 节点的值是否相等

  • 如果相等, list1 list2 同时往后走,去比较下一组数据
  • 如果不相等,说明链表不是回文结构,返回 false 

5. 当 list2 走到 NULL 处时,说明此链表是回文结构,返回 true 

🎨画图理解

可以看到本题需要调用之前写过的代码

这就是为什么我说前两道题是本题的基础

✍️代码实现

//找链表的中间节点
struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while (fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

//反转链表
struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode* cur = head;
    struct ListNode* prev = NULL;
    while (cur != NULL)
    {
        struct ListNode* next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    return prev;
}

//牛客这道题不支持用C语言答题
//虽然我们还没有学C++,但是C++是兼容C的
//直接用C的方式写代码即可
class PalindromeList
{
public:
    bool chkPalindrome(ListNode* head)
    {
        struct ListNode* list1 = head;
        struct ListNode* mid = middleNode(head);
        struct ListNode* list2 = reverseList(mid);
        while (list2 != NULL)
        {
            if (list1->val != list2->val)
            {
                return false;
            }
            list1 = list1->next;
            list2 = list2->next;
        }
        return true;
    }
};

提交代码:

成功通过

怎么样,大家看到这里把这三道题弄懂了吗?如果有问题可以在评论区留言哦 :D


 本文完

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot3整合使用aj-captcha行为验证码解决方案

截止到目前(2023-04-20),Springboot最新稳定版本已经迭代到3.0.5,而我们项目中使用的行为验证码框架aj-captcha还没有适配Springboot3,码云上类似的请求也没有得到过回应,于是决定自己动手适配一下,研究下来发现适配3.…

加盐加密算法

MD5加密加盐加密项目密码升级 MD5加密 MD5一系列公式进行复杂数学运算;特点:(用途校验和、计算hash值方式、加密) 1:定长;无论原始数据多长;算出的结果都是4或者8字节的版本。 2:冲…

Nodejs+vue+elementui汽车租赁管理系统_1ma2x

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui, 课题主要分为三大模块:即管理员模块、用户模块和普通管理员模块,主要功能包括&#…

【网络编程·网络层】IP协议

目录 一、IP协议的概念 二、IP协议的报头 1、四位首部长度 2、16位总长度(解包) 3、8位协议(分用) 4、16位首部校验和 5、8位生存时间 6、32位源IP和32位目的IP 7、4位版本/8位服务类型 8、16位标识 9、3位标志 10、1…

Element组件浅尝辄止2:Card卡片组件

根据官方说法: 将信息聚合在卡片容器中展示。 1.啥时候使用?When? 既然是信息聚合的容器,那场景就好说了 新建页面时可以用来当做页面容器页面的某一部分,可以用来当做子容器 2.怎样使用?How? //Card …

30.基于XML的声明式事务

基于XML的声明式事务 主要是使用XML去代替注解&#xff0c;来实现起到代替注解的作用&#xff0c;实际使用频率很低 将BookServiceImpl.java中的Transactional注解删除&#xff0c;确保用户余额充足 spring-tx-xml.xml <?xml version"1.0" encoding"UTF-8…

Linux:Shell编辑之文本处理器(sed)

目录 绪论 1、sed的原理&#xff1a;读取 执行 显示 三个过程 2、sed 文本内容处理工具&#xff0c;文件过大怎么办&#xff1f; 3、sed的操作选项 3.1 常用选项 3.2 操作符 3.3 行号的范围打印 3.4 对包含指定字符串的内容进行打印 3.5 删 3.5.1 正则表达式删除 3.6…

DNS:使用 bind9 配置主从权威DNS服务器

写在前面 分享一些 使用 bind9 配置主从权威名称服务器的笔记理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式…

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…

笔记本电脑如何把sd卡数据恢复

在使用笔记本电脑过程中&#xff0c;如果不小心将SD卡里面的重要数据弄丢怎么办呢&#xff1f;别着急&#xff0c;本文将向您介绍SD卡数据丢失常见原因和恢复方法。 ▌一、SD卡数据丢失常见原因 - 意外删除&#xff1a;误操作或不小心将文件或文件夹删除。 - 误格式化&#…

【资讯速递】AI与人类思维的融合;OpenAI在中国申请注册“GPT-5”商标;移动大模型主要面向to B 智能算力是未来方向

2023年8月11日 星期五 癸卯年六月廿五 第000001号 欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于IT资讯速递专栏,本专栏主要用于发布各种IT资讯&#xff0c;为大家可以省时省力的就能阅读和了解到行业的一些新资讯 资…

C++初阶之一篇文章教会你list(理解和使用)

list&#xff08;理解和使用&#xff09; 什么是list特点和优势基本操作示例用法与其他序列式容器&#xff08;如 std::vector 和 std::deque&#xff09;相比&#xff0c;std::list 显著的区别和优势成员类型 list构造函数1. default (1)2. fill (2)3.range (3)4. copy (4) li…

ubuntu20.04磁盘满了 /dev/mapper/ubuntu--vg-ubuntu--lv 占用 100%

问题 执行 mysql 大文件导入任务&#xff0c;最后快完成了&#xff0c;查看结果发现错了&#xff01;悲催&#xff01;都执行了 两天了 The table ‘XXXXXX’ is full &#xff1f; 磁盘满了&#xff1f; 刚好之前另一个 centos 服务器上也出现过磁盘满了&#xff0c;因此&a…

什么是Selenium?使用Selenium进行自动化测试

什么是 Selenium&#xff1f;   Selenium 是一种开源工具&#xff0c;用于在 Web 浏览器上执行自动化测试&#xff08;使用任何 Web 浏览器进行 Web 应用程序测试&#xff09;。   等等&#xff0c;先别激动&#xff0c;让我再次重申一下&#xff0c;Selenium 仅可以测试We…

大连交通大学813软件工程考研习题

1.什么是软件生存周期模型?有哪些主要模型? 生存周期模型&#xff1a;描述软件开发过程中各种活动如何执行的模型。对软件开发提供强有力的支持&#xff0c;为开发过程中的活动提供统一的政策保证&#xff0c;为参与开发的人员提供帮助和指导&#xff0c;是软件生存周期模型…

云计算——常见存储类型

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.存储类型 1.本地磁盘 2.DAS 3.NAS 4.SAN &#xff08;1&#xff09;FC SA…

锁定Mac的内置键盘,防止外接键盘时的误触

场景&#xff1a;把你的外接键盘放在mac上&#xff0c;然后打字时&#xff0c;发现外接键盘误触mac键盘&#xff0c;导致使用体验极差 解决方案&#xff1a;下载Karabiner-Elements这款软件&#xff0c;并给它开启相关权限。 地址&#xff1a;https://github.com/pqrs-org/Ka…

ModaHub魔搭社区——Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch矢量数据库对比

资本市场上,2022年也是风起云涌的一年的,各大向量数据库公司纷纷完成了千万美元级别新一轮的融资。可以预见,2023年将会是向量数据库继续快速发展的一年,也会是这一新兴技术由发展走向成熟的一年。这里针对Milvus 、Qdrant、Waeviate、Pinecone、ElasticSearch这五个流行的…

编写简单的.gitlab-ci.yml打包部署项目

服务器说明&#xff1a; 192.168.192.120&#xff1a;项目服务器 192.168.192.121&#xff1a;GitLab 为了可以使用gitlab的cicd功能&#xff0c;我们需要先安装GitLab Runner 安装GitLab Runner参考&#xff1a; GitLab实现CICD自动化部署_gitlab cidi_程序员xiaoQ的博客-CS…

HCIA---TCP/UDP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 前言 一.UDP协议简介 UDP协议的特点&#xff1a; 二.TCP协议简介 TCP协议特点 三.TCP和UDP的区别 四.TCP/IP结构详解 五.TCP运输连接的阶段 ​编辑 …