首先搞清楚几个问题。
1、如果链表为空,返回空。
2、如果链表中根本没有x,怎么办?那么就把链表中比x小的数放到第一个比x大的数的前面。
3、反正最后的链表就是两部分:比x小的数全部在前部分,相对顺序不变;>=x的数在后半部分,相对位置不变。
那么就可以采用一次遍历,先各自建一个链表,然后把这两种数提出来,用尾插法放到各自链表中,最后把两个链表连接起来即可。
struct ListNode* partition(struct ListNode* head, int x ) {
if(head == NULL)
return NULL; //空结点直接返回
struct ListNode* small = malloc(sizeof(struct ListNode)); //小数虚头结点
small->next = NULL; //头结点指针域置空
struct ListNode* shead = small; //小数链表头指针
struct ListNode* srear = small; //小数链表尾指针,用于尾插法
struct ListNode* large = malloc(sizeof(struct ListNode)); //大数链表类似
large->next = NULL;
struct ListNode* lhead = large;
struct ListNode* lrear = large;
struct ListNode* p = head; //工作结点
while(p != NULL){
if(p->val < x){ //比x小的数用尾插法插入小数链表
srear->next = p;
srear = p;
}
else{ //>=x的数用尾插法插入大数链表
lrear->next = p;
lrear = p;
}
p = p->next; //工作结点后移一位
}
lrear->next = NULL; //大链表尾指针域置空
srear->next = lhead->next; //链接两表,注意连接的是大数链表虚头结点的后继
return shead->next; //返回小数链表虚头结点的后继
}

京公网安备 11010502036488号