链接:. - 力扣(LeetCode)【点击即可跳转】
思路:创建新链表:大链表和小链表
将pcur节点小于x的值,尾插在小链表中
将pcur节点大于或等于x的值,尾插在大链表中
最终---- return lessHead->next;
注意:!!!
1.蓝色部分的
greaterTail大链表的尾结点的next指针指向NULL。
否则代码会出现死循环--【超出时间限制】
2.红色箭头部分的
将小链表的尾结点与大链表的第一个有效的 节点首尾相连
lessTail->next=greaterHead->next;
3.判断链表是否为空
代码实现:
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x)
{
if(head==NULL)
{
return head;
}
//创建两个带头链表
ListNode* lessHead,*greaterHead;
ListNode* lessTail,*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;
//大链表尾节点的next指针指向NULL(重要)
lessTail->next=greaterHead->next;
//小链表的尾结点与大链表的第一个有效的节点首尾相连
ListNode* ret=lessHead->next;
free(lessHead); //手动释放掉(也可不写)
free(greaterHead);
lessHead=greaterHead=NULL;
return ret;
}
感谢观看,如果对你有所帮助的话,点赞支持一下吧^.^