分割(隔)链表

给你一个链表的头节点 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;

 

posted @ 2021-05-21 10:22  偶遇的  阅读(41)  评论(0)    收藏  举报