题目如下:
解题过程如下:
链表分成两个部分:小于x的结点、大于等于x的结点
“不能改变原来的数据顺序”:指的是不能修改数据的相对顺序,如下图所示
思路:创建两个带头的空链表(大链表、小链表),遍历原链表,比x小的数据结点尾插到小链表中,大于等于x的数据结点尾插到大链表中,大链表的尾结点的next指针置为空,大链表和小链表首尾相连,最后将两个“哨兵位”销毁。
为什么要强调大链表的尾结点的next指针置为空呢?以下图为例,大链表的尾结点6在原链表中指向结点2,新链表中出现了一个环,最终返回新链表的头结点时,会出现死循环{1,2,5,3,6,2,5,3,6,……}
内存超限:代码出现死循环/无限次的递归(递归要创建函数栈帧,不断的向操作系统要内存)
完整代码如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
//struct是类,ListNode就是类型
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
//创建两个带头的空链表(大链表、小链表)
ListNode* lessHead, *lessTail;
lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));
ListNode* greaterHead, *greaterTail;
greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
//遍历原链表,比x小的结点尾插到小链表中,大于等于x的结点尾插到大链表中
ListNode* pcur = pHead;
while (pcur)
{
if (pcur->val < x)
{
lessTail->next = pcur;
lessTail = lessTail->next;
}
else {
greaterTail->next = pcur;
greaterTail = greaterTail->next;
}
pcur = pcur->next;
}
//大链表的尾结点的next指针置为空
greaterTail->next = NULL;
//大链表和小链表首尾相连
lessTail->next = greaterHead->next;
//销毁两个“哨兵位”,有借有还,再借不难
ListNode* ret = lessHead->next;
free(lessHead);
lessHead = NULL;
free(greaterHead);
greaterHead = NULL;
return ret;
}
};