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
}
}
鏈表:鏈表分割問題:以給定值x爲基準將鏈表分割成兩部分,所有小於x的結點排在大於或等於x的結點之前,分割後保持原來順序不變
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.