题目链接
解析:


完整代码:
cpp
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
#include <cstddef>
#include <unistd.h>
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
ListNode* lessHead,*lessTail;
lessHead = lessTail =(ListNode*)malloc(sizeof(ListNode));
ListNode* greaterHead,*greaterTail;
greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
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;
}
//跳出循环,链表遍历完,将大小链表相连
lessTail->next = greaterHead->next;
//将大链表的尾节点置为空,防止死循环
greaterTail->next = NULL;
//先保存要用的结点,再释放申请的两个哨兵位,并置为空,防止野指针
ListNode* retHead = lessHead ->next;
free(lessHead);
free(greaterHead);
lessHead = greaterHead = NULL;
return retHead;
}
};
有许多小细节需要注意:
- 申请结点的释放并置为空指针,防止野指针!!
- 多用几组测试案例去测试,这样考虑的更加全面,代码也更加完善!!
- 画图很关键!!