给你一个链表的头节点 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;
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐