leetcode刷题笔记86

写在前边

今天的题纯搞人的,说是中等其实就是个easy,然而我花费了很大的功夫去做,最大的问题是题目有一点描述的非常不清楚。。。

正文

题目描述:
给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入:head = 1->4->3->2->5->2, x = 3
输出:1->2->2->4->3->5

这是一道很简单的题目,只需要把大的和小的链表分开,最后接在一起就好了,但是我浪费了很多时间是因为,我以为题目所给链表是有头节点的。。。因此我想到,只需要把大的分出去,小的留下来就好了,然而这样就需要删除操作,由于我认为有头结点的存在,我认为对下一个节点进行判断操作是可行的,譬如:
head->A->B->C->D->E->F 这个链表中,我完全可以从head开始,令current=head,判断下一个节点的值(current->next->val)是否小于x如果是,不做任何操作,将current后移(current=current->next),如果不是,则用下一个节点的值作为参数new一个新节点,将其接在存储数值较大链表的后边,然后执行current->next=current->next->next的操作,把这个比较大的链表删除,再往后移(current=current->next),这样做一趟就可以分开两个链表,最后把大链表接在小链表后边就行了。

然而,题目中给的链表是没有头结点的。。。直接从第一个元素开始,这样就导致了需要对空表进行判断,而我写的方法中,无法判断该表是否为空(因为我认为参数中传来的节点是头节点,一定是非空的,也就没有实现对表的判断),我也无法处理第一个数,想要面面俱到,就得添加很多不比较的if分支。。。我一度以为我想错了,直到发现题目中给出的链表没有头节点。。。这样操作就简单很多了,不再赘述,源码如下:

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* small=new ListNode(0);
        ListNode* s_head=small;
        ListNode* big=new ListNode(0);
        ListNode* b_head=big;
        while(head!=nullptr)
        {
            if(head->val>=x)
            {
                ListNode* node=new ListNode(head->val);
                big->next=node;
                big=big->next;
            }
            else
            {
                ListNode* node=new ListNode(head->val);
                small->next=node;
                small=small->next;
            }
            head=head->next;
        }
        small->next=b_head->next;
        return s_head->next;
    }
};

还是得看清题目才能做题啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值