数据结构---分割链表

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值