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;
}
相关推荐
程序员东岸2 分钟前
《数据结构——排序(中)》选择与交换的艺术:从直接选择到堆排序的性能跃迁
数据结构·笔记·算法·leetcode·排序算法
YongCheng_Liang16 分钟前
Zabbix 6.4 完整部署教程:从环境准备到监控实战
linux·运维·zabbix
小白电脑技术24 分钟前
旧电脑安装流畅的系统?用虚拟机先体验一下Linux Mint!
linux·电脑
爱吃萝卜的美羊羊2 小时前
ubuntu下国内升级ollama
linux·运维·ubuntu
mzhan0172 小时前
Linux: console: printk: console_no_auto_verbose
linux·运维·服务器
Savvy..2 小时前
天机学堂-Day01
linux·服务器·网络
做怪小疯子2 小时前
LeetCode 热题 100——二叉树——二叉树的层序遍历&将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
CoderYanger3 小时前
递归、搜索与回溯-记忆化搜索:38.最长递增子序列
java·算法·leetcode·1024程序员节
w***15313 小时前
ubuntu 安装 Redis
linux·redis·ubuntu
liweiweili1264 小时前
Linux 中替换某个目录下所有文件中的特定字符串
linux·运维·服务器