题目描述
思路
创建两个非空链表,大链表和小链表;创建一个指针遍历原链表,找小于x的结点和其他结点分别尾插到小链表和大链表中;让大小链表首尾相连,返回新链表的头结点。
画图解释
创建两个非空链表,大链表和小链表
创建一个指针遍历原链表,找小于x的结点和其他结点分别尾插到小链表和大链表中
让大小链表首尾相连,返回新链表的头结点 (让lessTail指向greaterHead的下一个结点)
因为greaterHead指向的结点不是有效的结点,它只是占位置。
我们最终返回lessHead的下一个结点。
完整代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstdlib>
#include <functional>
class Partition {
public:
ListNode* partition(ListNode* pHead, int x)
{
// write code here
//创建两个非空链表:一个大链表,一个小链表
ListNode*lessHead,*lessTail;
lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));
ListNode*greatHead,*greatTail;
greatHead=greatTail=(ListNode*)malloc(sizeof(ListNode));
//遍历链表
ListNode*pcur=pHead;
while(pcur)
{
if(pcur->val<x)
{
//尾插到小链表
lessTail->next=pcur;
lessTail=lessTail->next;
}
else
{
//尾插到大链表
greatTail->next=pcur;
greatTail=greatTail->next;
}
pcur=pcur->next;
}
//将大链表的尾结点的next置为NULL
greatTail->next=NULL;
//大小链表首尾相连
lessTail->next=greatHead->next;
ListNode*ret=lessHead->next;
free(lessHead);
free(greatHead);
lessHead=greatHead=NULL;
return ret;
}
};