首先搞清楚几个问题。
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; //返回小数链表虚头结点的后继 }