分隔链表
给你一个链表的头节点
head
和一个特定值x
,请你对链表进行分隔,使得所有 小于x
的节点都出现在 大于或等于x
的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。
思路:
三指针:一个(front)记录val大于等于x的链表部分的头结点,另一个(back)记录val大于等于x的链表部分的尾结点,一个(pre)记录头结点之前的节点
大体流程:
- 遍历list:遇到大于等于x的node,插入到尾节点并更新尾节点;遇到小于x的node,插入到头结点前并更新pre
代码:
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if (!head || !head->next)
return head;
ListNode *front=nullptr, *back=nullptr, *pre = new ListNode(0), *tmp;
ListNode* ret = pre;
while (head) {
tmp = head->next;
if (head->val >= x) {
if (!front) {
front = back = head;
} else {
back->next = head;
back = head;
}
} else {
if (back) {
back->next = tmp;
head->next = front;
pre->next = head;
pre = head;
} else {
pre->next = head;
pre = head;
}
}
head = tmp;
}
if(!pre->next){
pre->next=front;
}
tmp=ret->next;
delete ret;
ret=tmp;
return ret;
}
};
注:
- 注意front和back的初始化,应该在首次遇到≥x的node时进行初始化
- 注意数据的极端化,可能先遇到≥x的,利用哨兵卫pre可以解决;可能全无<x的,需要特判