鏈表:鏈表分割問題:以給定值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
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章