leetcode-分割链表

题目

面试题 02.04. 分割链表

提示

给你一个链表的头节点 head 和一个特定值x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

示例 1:

复制代码
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

示例 2:

复制代码
输入:head = [2,1], x = 2
输出:[1,2]

提示:

  • 链表中节点的数目在范围 [0, 200]
  • -100 <= Node.val <= 100
  • -200 <= x <= 200

图解

代码(解析在代码注释中)

cpp 复制代码
/**
 * 定义单链表结构体
 * struct ListNode {
 *     int val;         // 节点值
 *     struct ListNode *next; // 指向下一个节点的指针
 * };
 */

typedef struct ListNode ListNode;

/**
 * @brief 将给定的单链表按照指定数值 `x` 进行分区操作,具体思路如下:
 * - 创建两个链表,分别用于存储小于 `x` 的节点(小链表)和大于等于 `x` 的节点(大链表)
 * - 遍历原链表,将每个节点与 `x` 进行比较,然后采用尾插法将节点分别插入到小链表或大链表中
 * - 当遍历结束后,将小链表尾部与大链表头部进行连接,并确保大链表的最后一个节点的 `next` 指针设置为 `NULL`
 *
 * @param head 输入单链表的头节点指针
 * @param x 作为分区依据的数值
 * @return 新的已分区后单链表的头节点指针
 */
struct ListNode* partition(struct ListNode* head, int x) {
    // 初始判断:如果链表为空,则直接返回空指针
    if (head == NULL) {
        return head;
    }

    // 创建两个链表,分别用于存储小于x的节点和大于等于x的节点,并初始化它们的头尾指针
    ListNode *Big_head = (ListNode*)malloc(sizeof(ListNode)), *Big_tail = Big_head;
    ListNode *Small_head = (ListNode*)malloc(sizeof(ListNode)), *Small_tail = Small_head;

    // 设置两个链表的起始哨兵节点,它们的next指针均初始化为NULL
    Big_head->next = NULL;
    Small_head->next = NULL;

    // 遍历原始链表,根据节点值大小将其插入相应的小链表或大链表中(尾插法)
    ListNode* tmp = head;
    while (tmp != NULL) {
        if (tmp->val < x) {
            Small_tail->next = tmp;
            Small_tail = Small_tail->next;
        } else {
            Big_tail->next = tmp;
            Big_tail = Big_tail->next;
        }
        tmp = tmp->next; // 移动到下一个待处理的节点
    }

    // 确保大链表尾部的next指针置为NULL,以正确结束链表
    Big_tail->next = NULL;

    // 将小链表尾部与大链表头部连接起来,形成最终分区后的链表
    Small_tail->next = Big_head->next;

    // 释放哨兵节点占用的内存,并重新定位新的链表头指针
    ListNode* new_head = Small_head->next;
    free(Small_head);
    free(Big_head);
    Small_head = Big_head = NULL;

    return new_head;
}
相关推荐
kymjs张涛7 小时前
OpenClaw 学习小组:初识
android·linux·人工智能
程序设计实验室9 小时前
经历分享,发现挖矿木马后,服务器快速备份与重装(腾讯云平台)
linux
Miku1611 小时前
OpenClaw-Linux+飞书官方Plugin安装指南
linux·人工智能·agent
Miku1611 小时前
OpenClaw 接入 QQ Bot 完整实践指南
linux·人工智能·agent
xlp666hub12 小时前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
xlp666hub15 小时前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
Yogurt_cry16 小时前
[树莓派4B] 闲置近10年的爱普生 L310 打印机爆改无线打印机
linux·物联网·树莓派
xlp666hub1 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode
Johny_Zhao2 天前
OpenClaw中级到高级教程
linux·人工智能·信息安全·kubernetes·云计算·yum源·系统运维·openclaw
Sheffield2 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker