链表分割:
以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,注意:数据的顺序不改变。
代码实现:
链表的定义:
typedef int SListDataType;
typedef struct SListNode {
SListDataType value; // 保存的值
struct SListNode* next; // 保存下一个结点的地址
} SListNode;
typedef struct SHead {
SListNode* first;
}SHead;
链表分割的实现:
//编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
SListNode* compaerSListNode(SHead* s, SListDataType date) { //date作为基准值
//创建两个链表
SListNode* small=NULL; //放小的
SListNode* sl = NULL; //小链表的最后一个结点
SListNode* big=NULL; //放大的
SListNode* bl = NULL; //大链表的最后一个结点
//这时候开始比较
//利用遍历原链表和基准值比,比较一个放一个
SListNode* cur = s->first;
for (cur = s->first; cur->next != NULL;cur=cur->next) {
if (cur->value<date) { //小于
//这时候要注意单单只是这样的赋值,后面再来就覆盖了,所以我们要加一个标准
if (sl->next==NULL) { //刚开始插入的时候
small = sl = cur;
}
else { //后续插入的时候
sl->next = cur; //最后一个后面插入
sl = cur; //改变最后一个结点位置
}
}
//大链表下面同理
else {
if (bl->next == NULL) { //刚开始插入的时候
big = bl = cur;
}
else { //后续插入的时候
bl->next = cur; //最后一个后面插入
bl = cur; //改变最后一个结点位置
}
}
}
//遍历结束开始合并两个链表
if (sl != NULL) {
sl->next = big;
}
//合并结束注意大链表的结尾还没有指向NULL
if (bl != NULL) {
bl->next = NULL;
}
//还没结,如果小的最后一个结点是空呢?也就是所有的值都比基准值大,这个判断条件里没有。
if (sl == NULL) { //这时候返回大链表就好了
return big;
}
else {
return small; //因为我们把大链表接在链表之后的,所以返回small
}
}