86.分隔链表

54d34905f24c432f88970c04d60257db.png

思路:

可以先将链表分隔成两个链表,一个链表为小于x的链表,一个链表为大于等于x的链表,然后将他们合并起来,就完成本题。

 (1)设置两个哨兵节点dummy1和dummy2分别来链接小于x的链表和大于等于x的链表。

(2)遍历原链表,将小的放在dummy1后,将大的放在dummy2后。

(3)分隔完成之后,将cur1->next=dummy2->next,完成链接,最后要将cur2->next=NULL避免成环。

 

8f47ca9ccaf740598a7cf3c16c0c2a59.png 

代码为

struct ListNode* partition(struct ListNode* head, int x){
    if(head==NULL)
        return NULL;
      struct ListNode* dummy1=(struct ListNode*)malloc(sizeof(struct ListNode));
      struct ListNode* dummy2=(struct ListNode*)malloc(sizeof(struct ListNode));
        dummy1->next=dummy2->next=NULL;
            struct ListNode* cur1=dummy1;
            struct ListNode* cur2=dummy2;
            struct ListNode* cur=head;
            while(cur)
            {
                if(cur->val<x)
                {
                    cur1->next=cur;
                    cur1=cur1->next;
                }
                else{
                    cur2->next=cur;
                    cur2=cur2->next;
                }   
                 cur=cur->next;
            }
            cur1->next=dummy2->next;
            cur2->next=NULL; 
            struct ListNode *newnode=dummy1->next;
            free(dummy1); 
            free(dummy2);
            return newnode;
         
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值