链接:. - 力扣(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;
}
感谢观看,如果对你有所帮助的话,点赞支持一下吧^.^