题目要求
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
例如
输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5
题解
//单链表的定义
* struct ListNode
* {
* int val;
* struct ListNode *next;
* };
struct ListNode* partition(struct ListNode* head, int x)
{
struct ListNode headLess, headGreater; //设小头结点和大头结点
struct ListNode *curLess, *curGreater; //创建了两条链
headLess.next = headGreater.next = NULL;
curLess = &headLess; //小的链
curGreater = &headGreater; //大的链
while(head)
{
if(head->val < x)
{
curLess->next = head; //第一次循环时生成带头结点的链
curLess = curLess->next;
}
else
{
curGreater->next = head; 第一次循环时生成带头结点的链
curGreater = curGreater->next;
}
head = head->next;
}
curGreater->next = NULL; //把大的链的下一个结点置空
curLess->next = headGreater.next; //小链的尾部指向大链的第一个结点(不包含头结点)
return headLess.next;
}
个人理解
将一条链按指定值的大小分为两条链,再将比指定值小的链表与大的链表拼凑,保证原链表的顺序。遍历原链表即可得出结果