给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。
~~思路一:在原链表上进行修改。
prev记录判断的结点的前一个结点
pcur记录当前节点
ptail记录原来的链表尾节点
newptail记录改变后的链表的尾节点,即每次都往它后面接
若pcur结点的值小于x,往后走,prev、pcur都到下一个位置
若pcur节点的值大于或等于x,将该节点尾插到原链表后,prev->next=pcur->next,free(pcur),pcur=prev->next;
~~思路二:创建新链表,遍历原链表
为了减少代码,增加一个头节点,头节点之后的链表为新链表
若pcur结点的值小于x,头插在新链表中
若pcur节点的值大于或等于x,尾插在新链表中
~~~最好的思路:创建新链表:小链表和大链表
最后将小链表和大链表首尾相接///注意头节点不要连进去
注意::一定要处理好大链表的尾节点,它未处理的话有可能使链表出现环,进而导致死循环
//思路三代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){
//这一块可以不写,因为后面对NULL处理的够好,也包含了这种情况
/*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;
}
//下面这两行不能调换顺序,涉及到初始化
greaterTail->next=NULL;//1.修改大链表指针指向,否则出现环导致死循环
//2.给next指针初始化,防止大链表中没有节点时,不能greaterHead->next这样访问,
// 因为一开始malloc的时候没有给这个next指针赋值,不知道系统自动赋值为什么
lessTail->next=greaterHead->next;
return lessHead->next;
}