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

这篇具有很好参考价值的文章主要介绍了【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

目录

1. 反转链表

做题思路

画图理解

代码实现

2. 链表的中间节点

做题思路

画图理解

代码实现

3. 链表的回文结构

做题思路

画图理解

代码实现


1. 反转链表

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

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

💭做题思路

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

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

这里需要3个指针:

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

🎨画图理解

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

✍️代码实现

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;
}

最后提交代码试试:

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

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


2. 链表的中间节点

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

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

💭做题思路

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

🎨画图理解

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

✍️代码实现

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;
}

提交代码:

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

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

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


3. 链表的回文结构

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

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

💭做题思路

1. 找到中间节点

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

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

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

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

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

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

🎨画图理解

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

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

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

✍️代码实现

//找链表的中间节点
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;
    }
};

提交代码:

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

成功通过

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


 本文完文章来源地址https://www.toymoban.com/news/detail-646093.html

到了这里,关于【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)

    目录  一.什么是链表 二.链表的实现 节点的插入 头插法 尾插法 指定位置插入 节点的删除 删除第一次出现的节点 删除所有节点 节点的查找 链表的清空 链表的长度 前言: 在上一篇文章中,我们认识了线性数据结构中的顺序表,而本篇文章则是介绍线性数据结

    2024年02月05日
    浏览(61)
  • 【数据结构-链表-01】反转链表

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月10日
    浏览(44)
  • 反转链表、链表的中间结点、合并两个有序链表【LeetCode刷题日志】

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 这里解释一下三个指针的作用: n1:记录上一个节点,如果是第一个就指向空 n2:记录此节点的位置 n3:记录下一个节点的位置,让翻转后能找到下一个节点

    2024年02月03日
    浏览(50)
  • 【算法入门&链表】【模板】链表|反转链表|合并排序链表|删除链表的节点

    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:算法百炼成神 本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面

    2024年02月17日
    浏览(60)
  • 【数据结构和算法】反转链表

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:迭代(双指针) 2.2 方法二:递归 三、代码 3.1 方法一:迭代(双指针) 3.2 方法二:递归 四、复杂度分析 4.1 方法一:迭代

    2024年01月18日
    浏览(53)
  • 【leetcode】链表的中间节点|链表中倒数第k个节点

    目录 1.链表的中间节点 2.链表中倒数第k个节点  思路1:遍历链表,统计节点个数count,返回第count/2 +1个节点  📖Note: 注意循环条件为--mid,--mid循环执行mid-1次,mid--循环mid次,返回的是中间节点的下一个节点 思路二:快慢指针 设置一个慢指针slow,一个快指针fast,慢指针一

    2024年02月15日
    浏览(34)
  • LC-链表的中间节点(双指针)

    链接:https://leetcode.cn/problems/middle-of-the-linked-list/description/ 描述:给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 输入:head = [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 3 。 输入:head = [1,2,3,4,5,6

    2024年02月12日
    浏览(46)
  • <数据结构> 链表 - 链表的概念及结构

    概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链接 次序实现的 1、链表由一系列结点(链表中每一个元素称为结点)组成。 2、结点可以在运行时动态(malloc)生成。 3、每个结点包括两个部分:一个是存储数据元素的

    2023年04月09日
    浏览(44)
  • 【数据结构】链表的回文结构

    单链表的操作算法是笔试面试中较为常见的题目。 本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _ 😀 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针

    2024年02月12日
    浏览(54)
  • 【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点

    目录 一.【Leetcode203】移除链表元素 1.链接 2.题目再现  A.双指针法 B.类尾删法 C.哨兵位 二.【Leetcode876】链表的中间节点 1.链接:链表的中间节点 2.题目再现 3.解法:快慢指针 三.链表中倒数第k个节点 1.链接:链表中倒数第k个节点 2.题目再现 3.解法 :快慢指针 1.链接 移除链表

    2024年02月01日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包