【LeetCode】数据结构题解(5)[分割链表]

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

所属专栏:玩转数据结构题型
博主首页:初阳785
代码托管:chuyang785
感谢大家的支持,您的点赞和关注是对我最大的支持!!!
博主也会更加的努力,创作出更优质的博文!!
关注我,关注我,关注我,重要的事情说三遍!!!!!!!!

1.题目来源

分割链表

2.题目描述

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。
【LeetCode】数据结构题解(5)[分割链表]

3.解题思路

本题的意思就是说把下小于x的数据放在左边,大于等于x的数据放在右边,在改变顺序的同时不改变原来的的循序。
我们的思路是创建两个链表,一个链表LessHead放小于下的数据,另一个链表greaterHead放大于等于x的数据,最后把两个两边合并成一个链表,然后返回新链表的首节点地址就行了。

为了方便链接,我们使用创建哨兵的方法来作为两个链表的头节点,所谓哨兵为就是它的val是无效数据,但是它的next指向下一个地址。
接着我们创建一个变量cur来遍历我们的链表,然后根据他们的大小来给他们分配到不同的链表里去。

图解:
【LeetCode】数据结构题解(5)[分割链表]
当x=3 的时候,cur开始遍历,首先是第一个节点的数据是1它比3小我们就把他链接到我们的LessHead链表中去,同时我们用LessNext来记录链接过来的节点点的地址,在以后往后链接的时候只需要用LessHead表示就好,这样的好处是链接完后我们返回链表的头节点的地址的时候就直接返回LessHead就行了。
【LeetCode】数据结构题解(5)[分割链表]
同样的cur遍历完第一个后只需要是cur=cur->next就可以访问第二个节点了,因为我们在链接第一个节点的时候并没有破坏我们第一个节点指向我们第二个节点的通道,我们依然可以通过第一个节点找到第二个节点,同样的我们用greaterNext来表示我们接下来的节点地址。
【LeetCode】数据结构题解(5)[分割链表]
以此类推到我们的cur指向NULL的时候我们的循环就停止了。
接着就是将两个链表合并就行。
【LeetCode】数据结构题解(5)[分割链表]
我们只需要将lessTail->next=greaterHead->next;就行了。
但是这里有个特别重要的事情就是我们连接完后我们的greaterNext指向那里了?它真的就指向了NULL吗?答案是否定的。
我们回到之前链接的时候:
【LeetCode】数据结构题解(5)[分割链表]
我们看到这里我们的存放5数据的next是指向2的地址的。
【LeetCode】数据结构题解(5)[分割链表]

所以他的图像解析就变成了这个样子,如果是这样的话,就成环了,再返回地址的时候内存就会出问题。
所以这里的解决方案就是把我们的greaterNext->next置空即:greaterNext->next=NULL。文章来源地址https://www.toymoban.com/news/detail-444977.html

4.代码展示

struct ListNode* partition(struct ListNode* head, int x)
{
    //创建哨兵位,方便链接
    struct ListNode* lessHead,*lessTail,*greaterHead,*greaterTail;
    //存放小于x的数据
    lessHead=lessTail=(struct ListNode*)malloc(sizeof(struct ListNode));
    lessHead->next=NULL;
    
	//存放大于等于x的数据
    greaterHead=greaterTail=(struct ListNode*)malloc(sizeof(struct ListNode));
    greaterHead->next=NULL;
	
	//遍历链表指针
    struct ListNode* cur=head;

    while(cur)
    {
        //尾插
        if(cur->val < x)
        {
            lessTail->next=cur;
            lessTail=cur;
        }
        else
        {
            greaterTail->next=cur;
            greaterTail=cur;
        }
        cur=cur->next;
    }
    //链接两个链表
    lessTail->next=greaterHead->next;
    //消除环,我们的5最后还指向我们2,这个时候就形成了一个环、
    greaterTail->next=NULL;

    struct ListNode* newnode=lessHead->next;
    //最后释放两个创建的内存空间
    free(lessHead);
    free(greaterHead);
    return newnode;
}

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

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

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

相关文章

  • 【LeetCode】数据结构题解(13)[设计循环链表]

    所属专栏:玩转数据结构题型❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ 🚀 关注我,关注我,关注我,重要的事情说三遍!!!!!

    2024年02月13日
    浏览(57)
  • 【LeetCode】数据结构题解(12)[用栈实现队列]

    所属专栏:玩转数据结构题型❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ 🚀 关注我,关注我,关注我,重要的事情说三遍!!!!!

    2024年02月13日
    浏览(42)
  • 【LeetCode】数据结构题解(11)[用队列实现栈]

    所属专栏:玩转数据结构题型❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ 🚀 关注我,关注我,关注我,重要的事情说三遍!!!!!

    2024年02月13日
    浏览(39)
  • LeetCode 刷题 数据结构 链表 203 移除链表元素

    Given the  head  of a linked list and an integer  val , remove all the nodes of the linked list that has  Node.val == val , and return  the new head . Example 1: Example 2: Example 3: Constraints: The number of nodes in the list is in the range  [0, 104] . 1 = Node.val = 50 0 = val = 50 今天leetcode的中文官网比较卡,所以是登录官网进行

    2024年02月14日
    浏览(36)
  • 【数据结构 | 链表】leetcode 2. 两数相加

    个人主页:兜里游客棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里游客棉花糖 原创 收录于专栏【LeetCode】 原题链接:点击直接跳转到该题目 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位

    2024年02月05日
    浏览(52)
  • 【算法与数据结构】416、LeetCode分割等和子集

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题可以抽象成一个01背包的问题,关于01背包可以看【算法与数据结构】算法与数据结构知识点。 本题只需要求出数组的累积和,然后和的一半就可以视为背包的最大重量,目标

    2024年01月19日
    浏览(42)
  • 【数据结构】[LeetCode138. 复制带随机指针的链表]

    给你一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random  ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的  深拷贝 。 深拷贝应该正好由  n  个  全新  节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的  next  指针和

    2024年02月04日
    浏览(49)
  • 【数据结构】LeetCode升级版的环形链表,复制带随机指针的链表

              1、题目说明           2、题目解析           1、题目说明           2、题目解析      1、题目说明 题目链接: 升级版的环形链表  给定一个链表的头节点 head ,返回链表开始入环的第一个节点。  如果链表无环,则返回NULL。 如果链表中有某个节点,可以通

    2024年01月16日
    浏览(62)
  • 数据结构:带环单链表基础OJ练习笔记(leetcode142. 环形链表 II)(leetcode三题大串烧)

    目录 一.前言  二.leetcode160. 相交链表  1.问题描述 2.问题分析与求解 三.leetcode141. 环形链表 1.问题描述 2.代码思路  3.证明分析  下一题会用到的重要小结论: 四.leetcode142. 环形链表 II 1.问题描述 2.问题分析与求解 Judgecycle接口: 方法一: 方法二:  单链表和带环单链表

    2023年04月08日
    浏览(40)
  • 数据结构-链表结构-双向链表

    双向链表也叫双链表,与单向链表不同的是,每一个节点有三个区域组成:两个指针域,一个数据域 前一个指针域:存储前驱节点的内存地址 后一个指针域:存储后继节点的内存地址 数据域:存储节点数据 以下就是双向链表的最基本单位 节点的前指针域指向前驱,后指针

    2024年02月04日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包