分割(隔)链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
受哨兵结点启发,新建两个伪头,然后将比较结果分别后插到两个链表中,最后将第二个链表后插到第一个链表,需要注意的是两个新链表的尾部必定会有一个尾部没有指向NULL,假如这个结点在第一个新链表,那么不影响,因为该结点后面还要接上第二个新链表,但是如果出现在第二个新链表,那么就要手动将其尾结点next置NULL
struct ListNode* new=(struct ListNode*)malloc(sizeof(struct ListNode));//第一个新链表伪头 struct ListNode* newstep=new;//第一个新链表的迭代结点 struct ListNode* add=(struct ListNode*)malloc(sizeof(struct ListNode));//第二个新链表伪头 struct ListNode* addstep=add;//第二个新链表的迭代结点 if(head==NULL) return head; while(head) { if(head->val<x)//满足条件后插第一个新链表 {
newstep->next=head; head=head->next; newstep=newstep->next; } else//否则后插第二个新链表 { addstep->next=head; head=head->next; addstep=addstep->next; } } addstep->next=NULL;//手动将第二个链表的尾结点next置NULL newstep->next=add->next; return new->next;
浙公网安备 33010602011771号