链表分割_牛客题霸_牛客网
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
#include
typedef struct ListNode ListNode;
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// 思路:创建两个临时链表,分别存储小于x和大于等于x的节点
// 最后将两个链表连接起来
// 定义两个哑头节点(简化边界处理)和对应的尾指针
// lesshead/lesstail:存储所有小于x的节点
// greaterhead/greatertail:存储所有大于等于x的节点
ListNode *lesshead , *greaterhead;
ListNode *lesstail , *greatertail;
// 为哑节点分配内存
lesshead = lesstail = (ListNode*)malloc(sizeof(ListNode));
greaterhead = greatertail = (ListNode*)malloc(sizeof(ListNode));
// 初始化哑节点的next指针为NULL
lesshead->next = greaterhead->next = NULL;
// 遍历原链表
ListNode* cur = pHead;
while(cur) {
if(cur->val next = cur; // 将当前节点链接到less链表尾部
lesstail = lesstail->next; // 更新less链表的尾指针
} else {
// 当前节点值大于等于x,加入到greater链表
greatertail->next = cur; // 将当前节点链接到greater链表尾部
greatertail = greatertail->next; // 更新greater链表的尾指针
}
cur = cur->next; // 移动到下一个节点
}
// 将less链表的尾部与greater链表的头部连接
lesstail->next = greaterhead->next;
// 确保新链表的尾部为NULL,避免出现环
greatertail->next = NULL;
// 保存新链表的头节点(lesshead的下一个节点)
ListNode* list = lesshead->next;
// 释放哑节点的内存(避免内存泄漏)
free(lesshead);
free(greaterhead);
return list;
}
};
/* 样例讲解:
假设输入链表为:1 -> 4 -> 3 -> 2 -> 5 -> 2,x = 3
步骤1:初始化两个哑节点
lesshead(哑) -> NULL
greaterhead(哑) -> NULL
步骤2:遍历原链表并分区
- 节点1(1 1 (lesstail指向1)
greaterhead -> NULL
- 节点4(4 ≥ 3):加入greater链表
lesshead -> 1
greaterhead -> 4 (greatertail指向4)
- 节点3(3 ≥ 3):加入greater链表
lesshead -> 1
greaterhead -> 4 -> 3 (greatertail指向3)
- 节点2(2 1 -> 2 (lesstail指向2)
greaterhead -> 4 -> 3
- 节点5(5 ≥ 3):加入greater链表
lesshead -> 1 -> 2
greaterhead -> 4 -> 3 -> 5 (greatertail指向5)
- 节点2(2 1 -> 2 -> 2 (lesstail指向2)
greaterhead -> 4 -> 3 -> 5
步骤3:连接两个链表
less链表尾部(2) -> greater链表头部(4)
最终链表:1 -> 2 -> 2 -> 4 -> 3 -> 5
步骤4:释放哑节点内存,返回结果链表
*/