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的结点之前,分割后保持原来顺序不变
最新推荐文章于 2021-11-08 12:59:08 发布