链表:链表分割问题:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,分割后保持原来顺序不变

typedef struct  SListNode {
    int  value;    // 保存的值
    struct SListNode* next;    // 保存下一个结点的地址
} SListNode_t;
 
    
//编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
SListNode_t* compaerSListNode(SListNode_t* head, int key) 

    if( NULL== head)
    {
        return head;
    }
    //创建两个链表
   SListNode_t* small=NULL;    //放小的
   SListNode_t* small_tail = NULL;    //小链表的最后一个结点
   SListNode_t* big=NULL;    //放大的
   SListNode_t* big_tail = NULL;    //大链表的最后一个结点
    //这时候开始比较
    //利用遍历原链表和基准值比,比较一个放一个
   SListNode_t* cur = head;
    while(cur)
    {
        if (cur->value < key) 
        {    
            if (NULL == small) 
            { 
                small =  cur;
                small_tail = cur;
            }
            else 
            {    
               small->next = cur;    //最后一个后面插入
               small_tail = cur;    //改变最后一个结点位置
            }
    
        }
        //大链表下面同理
        else 
        {
            if (NULL == big) 
            {    //刚开始插入的时候
                big = cur;
                big_tail = cur;
            }
            else 
            {    //后续插入的时候
               big->next = cur;    //最后一个后面插入
               big_tail = cur;    //改变最后一个结点位置
            }
 
        }
    cur = cur->next;
    }
    //遍历结束开始合并两个链表
    if (small_tail != NULL) 
    {
       small_tail->next = big;
    }
    //合并结束注意大链表的结尾还没有指向NULL 
    if (big_tail != NULL) 
    {
       big_tail->next = NULL;
    }
    //还没结,如果小的最后一个结点是空呢?也就是所有的值都比基准值大,这个判断条件里没有。
    if (small_tail == NULL) 
    {    //这时候返回大链表就好了
        return big;
    }
    else 
    {
        return small;    //因为我们把大链表接在链表之后的,所以返回small
    }
}

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值