1. 题目
编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 题目意思:将小于x的节点放在x前部
partTail
是满足上面要求的部分的尾巴- 建立空头节点哨兵,用
head
遍历,prev
记录前置节点
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode *emptyHead = new ListNode(-1), *prev, *partTail;
emptyHead->next = head;
partTail = prev = emptyHead;
while(head)
{
if(head->val < x && partTail != prev)//注意第二个条件
{
prev->next = prev->next->next;//把head断开
head->next = partTail->next;//head接入小于x的段
partTail->next = head;//head接上前段尾巴
partTail = partTail->next;//更新尾巴,这句也可以不要
//不要的话,就是partTail其实是头,不变,一直往头上插入节点
head = prev->next;//更新head
}
else //其他情况直接后移
{
prev = head;
head = head->next;
}
}
return emptyHead->next;
}
};