题目
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
思路
设置三个辅助节点
1.虚拟头节点vir,方便函数的返回值
2.小于x的节点中最靠近x的节点 left,作用是插入下一个小于x的节点
3.当前节点的前置节点pre,删除当前节点的时候要用到
实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (!head) return head;
// 虚拟头结点,方便函数的返回值
ListNode* vir = new ListNode(0);
vir->next = head;
// 左边最靠近x的节点,方便节点插入
ListNode* left;
if (head->val >= x) {
left = vir;
} else {
left = head;
}
// 当前节点的前置节点,方便删除当前节点
ListNode* pre = head;
// 当前节点
ListNode* start = head->next;
while (start) {
if (start->val < x) {
cout << "here " << pre->val << "\t" << left->val << endl;
if (pre != left) {
ListNode* node1 = start->next;
ListNode* node2 = left->next;
left->next = start;
start->next = node2;
pre->next = node1;
left = start;
start = node1;
continue;
}
left = left->next;
}
start = start->next;
pre = pre->next;
}
return vir->next;
}
};