- 分隔链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
struct ListNode* partition(struct ListNode* head, int x){
if(head!=NULL){
//1.设置头节点
struct ListNode *rhead=(struct ListNode*)malloc(sizeof(struct ListNode));
rhead->next=head;
//2.找到第一个大于x的节点(MAX)和它的前驱
struct ListNode *p=rhead->next;
struct ListNode *pre=rhead;
while(p->next!=NULL&&p->val<x){
pre=p;
p=p->next;
}
//3.原链中删除MAX
pre->next=p->next;
//4.保留第一个数据节点及之后元素
struct ListNode *pCur=rhead->next;
//5.原链表只保留MAX
p->next=rhead->next;
rhead->next=p;
p->next=NULL;
//6.为MAX设置前驱prep始终指向它的前驱,prep相当于MAX前的链表的尾指针
struct ListNode *prep=rhead;
//7.遍历之前保留的节点插入到只有MAX的链表
while(pCur!=NULL){
//要插入的节点
struct ListNode *tmp=pCur;
//保留下一个要比较的节点
pCur=pCur->next;
//每次比较小于x则插入到MAX前
if(tmp->val<x){
tmp->next=prep->next;
prep->next=tmp;
prep=prep->next;
}else{//每次比较大于等于x则插入到MAX后,这里p相当于尾指针
tmp->next=p->next;
p->next=tmp;
p=tmp;
}
}
//8.让head指向排好的第一个数据节点
head=rhead->next;
//9.释放开始设置的头节点
free(rhead);
}
return head;
}
执行时间0ms 内存5.7MB