写在前边
今天的题纯搞人的,说是中等其实就是个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;
}
};
还是得看清题目才能做题啊。