/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){
if(head ==NULL)
{
return head;
}
//创建新链表
ListNode* lessHead,*lessTail;
ListNode* greaterHead,*greaterTail;
lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));
greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));
//遍历原链表
ListNode* pcur=head;
while(pcur)
{
if(pcur->val<x)
{
//尾插到小链表中
lessTail->next=pcur;
lessTail=lessTail->next;
}else{
//尾插到大链表
greaterTail->next=pcur;
greaterTail=greaterTail->next;
}
pcur=pcur->next;
}
//连接两个链表
greaterTail->next=NULL;
lessTail->next=greaterHead->next;
ListNode* ret=lessHead->next;
free(lessHead);
free(greaterHead);
lessHead=greaterHead=NULL;
return ret;
}
创建两个带头链表,遍历原链表,将原链表的节点分别尾插到新链表中。如果节点的值小于x时插入到小链表中,如果节点的值大于x时插入到大链表中。
要把两个链表相连,不要连上头节点。让小链表连上大链表的头的下一个节点。注意大链表的最后一个节点还连着之前的节点,所以把最后一个节点的下一个节点置为空。
最后释放掉两个头节点,返回小链表头节点的下一个节点。