题目描述
思路
这道题可以使用哨兵卫的方式,将链表分为两部分,一部分比x小,一部分大于大于等于x。分开之后再将两个链表连接,释放哨兵卫。
解题方法
创造两个哨兵卫作为头节点,之后用尾插的方式将链表依次取下来尾插,分别放入不同的链表。尾插结束后,将小链表的尾与大链表的头(哨兵卫的下一个)连接,为防止出现环结构的死循环,将大链表的尾置空,之后存储上整个链表的有效头节点,释放两个哨兵卫
代码实现
typedef struct ListNode ListNode;
ListNode* partition(struct ListNode* head, int x){
ListNode* lessHead,*lesstail;//定义比x值小的链表
ListNode* greaterHead,*greatertail;//定义比x值大的链表
lessHead=lesstail=(ListNode*)malloc(sizeof(ListNode));//小链表的哨兵卫
greaterHead=greatertail=(ListNode*)malloc(sizeof(ListNode));//大链表的哨兵卫
lessHead->next=greaterHead->next=NULL;//数据初始化
//取下节点尾插
ListNode* cur=head;
while(cur)
{
if(cur->val<x)//比x值小的节点尾插进小链表
{
lesstail->next=cur;
lesstail=lesstail->next;
}
else//比x值大的节点尾插进大链表
{
greatertail->next=cur;
greatertail=greatertail->next;
}
//迭代
cur=cur->next;
}
lesstail->next=greaterHead->next;//小链表尾的下一个是大链表的头
greatertail->next=NULL;//将大链表的最后节点的next置为空,防止出现环结构
ListNode* list=lessHead->next;//存储链表头节点,防止free的时候丢失数据
free(greaterHead);
free(lessHead);
return list;
}