【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表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


 本文完

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP Mysql查询全部全部返回字符串类型

设置pdo属性 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

JAVA初体验 (HelloWorld)

1.编写代码 文件名字HelloWorld.java public class HelloWorld{public static void main(String [] args){System.out.printf("hello world!");} } 2.编译(cmd) javac HelloWorld.java 运行完之后 会出现一个 HelloWorld.class 3.运行 j…

0基础学习VR全景平台篇 第83篇:智慧眼-怎么理解分类?

一、功能说明 分类可以理解为,为了方便城市运营工作的管理所实行的行政区划,如XXX乡镇、XXX街道等等。 二、后台编辑界面 1、点击【新增】,填写分类的名称,若有上一级分类,那么还需选择父级分类,建议从最…

WordPress 子主题(child theme)介绍

经常开发WordPress主题的朋友往往会遇到一个困惑,虽然主题提供了默认设置,也自带了不少自定义功能,可以满足大部分的场景使用,但毕竟众口难调,一些个性化的需求难免无法满足,这时就必须得修改主题文件来实现…

解决MySQL与Redis缓存一致性的问题

背景 考试系统中,教师会在后台发布一场考试,考试会存储在MySQL和Redis里面,考试有时候是会出错的,我们需要后台修改,如果多个教师在后台并发修改(概率不大),可能会出现数据库缓存不…

Vue 3.0中的Treeshaking?

1.treeshaking是什么? Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术,专业术语叫 Dead code elimination 简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码 如果把代码打包比作制作蛋糕&#…

pycharm,VSCode 几个好用的插件

pycharm Tabnine AI Code 可以在编写程序的时候为你提供一些快捷方式,增加编程速度 Chinese 对英文不好的程序员来说是个不错的选择,可以将英文状态下的pycharm变为中文版的 ChatGPT 可以跟ai聊天,ai可以解决你80%的问题 ,也可以帮…

让我们玩个游戏:找出缅北诈骗网络中的“狼人杀”!

大数据产业创新服务媒体 ——聚焦数据 改变商业 近期,《孤注一掷》掀起了一阵观影热潮。这部电影展现了在高科技与诈骗手法交织下的惊心动魄的故事,不仅让观众们大呼过瘾,更让人们对现实生活中日益猖獗的缅北诈骗产生了深入的反思。 《孤注一…

浅谈LLAMA2核心函数generate源码

在学习LLAMA2的generate源码之前,先介绍Temperature超参数及sample_top_p的原理。 Temperature Temperature 是一个超参数,可用于控制生成语言模型中生成文本的随机性和创造性。用于调整模型的softmax输出层中预测词的概率。 softmax函数: p ( x i )…

日常BUG—— maven编译报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 一个maven项目在由于在代码中书写了如下代码&#xff1a; public static ConcurrentMap<…

shell和反弹shell

文章目录 是什么&#xff1f;bash是什么&#xff1f;反弹shell 是什么&#xff1f; Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了…

《甲午》观后感——GPT-3.5所写

《甲午》是一部令人深思的纪录片&#xff0c;通过生动的画面和真实的故事&#xff0c;向观众展示了中国历史上的一段重要时期。观看这部纪录片&#xff0c;我深受触动&#xff0c;对历史的认识也得到了深化。 首先&#xff0c;这部纪录片通过精心搜集的历史资料和珍贵的影像资料…