1.代码展示
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;
}
//修改大链表的尾节点的Next指针指向
greaterTail->next = NULL;//不加会出现死循环
//首尾相连
lessTail->next = greaterHead->next;
ListNode* ret = lessHead->next;
free(lessHead);
free(greaterHead);
lessHead = greaterHead = NULL;
return ret;
}
2.思路解析
首先通过题目可以得到的初步信息是,给出一个链表和一个节点,并且以该节点为切割点分为左右部分,左边均小于该节点,右边均大于或者等于该节点。
当然思路是多变的,本次我要分享的是创建两个新链表从而实现链表的分割。
1.所以首先创建两个带头链表
//创建两个带头链表
ListNode* lessHead,*lessTail;
ListNode* greaterHead,*greaterTail;
lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));
greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));
2.遍历原链表,根据限制条件将元素分给两个链表
//遍历原链表,将原链表节点插入大小链表中
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;
}
3.注意大链表最后要置于NULL,否则会出现死循环
//修改大链表的尾节点的Next指针指向
greaterTail->next = NULL;//不加会出现死循环
4.将两个链表链接起来,注意动态内存开辟的空间要free
//首尾相连
lessTail->next = greaterHead->next;
ListNode* ret = lessHead->next;
free(lessHead);
free(greaterHead);
lessHead = greaterHead = NULL;
return ret;