题目

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。

解法

这道题自己最初的思路是这样的,首先找到给定值x的那个节点为px,然后按下图所示的方法进行操作:

class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
if(pHead==NULL || pHead->next==NULL)
return pHead;
ListNode* px=pHead;
ListNode* p1=pHead;
ListNode* p2=pHead->next;
while(px!=NULL)
{
if(px->val==x)
break;
} while(p2->next!=NULL)
{
if(p2->val>x)
{
p1->next=p2->next;
p2->next=px->next;
px->next=p2;
p1=p1->next;
p2=p1->next;
}
p1=p1->next;
p2=p2->next;
}
}
};

但是这样的做法有几个错误,第一个,题目要求的是给定值x为基准进行分割,并没有说这个x一定是某个绩点,这样子的话就会找不到x这个节点;第二个错误是,这个算法只能将大于x的节点调到节点x之后,在x节点之后如果存在小于x的节点是无法移动到前面的,这是由于链表的单向指向性。所以这个思路完全是不可用的!!

更改解法:

创建两个新链表,一个存小的、一个存大的;最后将小的和大的拼接起来就OK了。键代码:

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
ListNode* partition(ListNode* pHead, int x) {
// write code here
if(pHead==NULL || pHead->next==NULL)
return pHead;
ListNode* pNode=pHead;
ListNode* small=new ListNode(0);
ListNode* big=new ListNode(0);
ListNode* p1=small;
ListNode* p2=big;
while(pNode!=NULL)
{
if(pNode->val<x)
{
p1->next=pNode;
pNode=pNode->next;
p1=p1->next;
p1->next=NULL;
}
else
{
p2->next=pNode;
pNode=pNode->next;
p2=p2->next;
p2->next=NULL;
}
}
p1->next=big->next;
return small->next;
}
};

另外一种类似的方法,不用创建两个链表,而是创建一个链表,原链表如果小于x就加入到新链表并将原链表这个节点删去。最后就爱那个两个链表连接起来就可以了:

class Solution{
public:
LinkList partition(LinkList L,int key)
{
LinkList L1=(LinkList)malloc(sizeof(LNode));
LinkList q=L1;
LinkList cur=L;
while(cur->next)
{
cur=cur->next;
if(cur->next->data<key)
{
LinkList p=cur->next;
cur->next=p->next;
q->next=p;
q=p;
}
}
q->next=L->next;
free(L);
}
};

CC11:链表分割的更多相关文章

  1. cc150 --链表分割

    题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...

  2. 链表分割——牛客剑指offer

    题目描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...

  3. 链表分割 牛客网 程序员面试金典 C++ Python

    链表分割 牛客网 程序员面试金典 C++ Python 题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* p ...

  4. LeetCode OJ:Partition List(分割链表)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  5. 面试题目——《CC150》链表

    面试题2.1:编写代码,移除未排序链表中的重复结点 进阶:如果不得使用临时缓冲区,该怎么解决? package cc150; import java.util.HashMap; import java ...

  6. linux内核之链表操作解析

    本文只是对linux内核中的链表进行分析.内核版本是linux-2.6.32.63.文件在:linux内核/linux-2.6.32.63/include/linux/list.h.本文对list.h ...

  7. 【Cracking the Code Interview(5th edition)】二、链表(C++)

    链表结点类型定义: class Node { public: ; Node *next = nullptr; Node(int d) { data = d; } }; 快行指针(runner)技巧: ...

  8. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

  9. 二刷Cracking the Coding Interview(CC150第五版)

    第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...

随机推荐

  1. nginx+keepalived简单双机主从热备

    双机主从热备概述 可以两台机子互为热备,平时各自负责各自的服务.在做上线更新的时候,关闭一台服务器的tomcat后,nginx自动把流量切换到另外一台服务的后备机子上,从而实现无痛更新,保持服务的持续 ...

  2. ThinkPHP基础(1)

    多层MVC模式 M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 控制器访问及路由解析 通过url地址get参数找到指定的控 ...

  3. 分布式锁的实现方式——ACID数据库、缓存或者是zk

    针对分布式锁的实现,目前比较常用的有以下几种方案: 基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Zookeeper实现分布式锁 在分析这几种实现方案之 ...

  4. erlang的map基本使用

    maps 适用于需要在运行时改变数据结构(record则不行)的场景,可以动态增加key 数据量不宜过大,具体多大没有实际数据, maps from_list  如果list表很长,则相应的耗时时间会 ...

  5. ACM学习历程——HDU1331 Function Run Fun(锻炼多维dp的打表)

    Description We all love recursion! Don't we?        Consider a three-parameter recursive function w( ...

  6. Linux中vsftpd安装和配置

    目录 Redhat/CentOS安装vsftp软件 Ubuntu/Debian安装vsftp软件 Redhat/CentOS安装vsftp软件 1. 安装vsftp $ yum install vsf ...

  7. uC/OS-II源码分析(四)

    内核结构 1,  临界区,OS_ENTER_CRITICAL和OS_EXIT_CRITICAL 为了处理临界区代码,必须关中断,等处理完毕后,再开中断.关中断可以避免其他任务或中断进入临界区代码.uC ...

  8. BZOJ2028:[SHOI2009]会场预约(平衡树版)

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  9. Nuget:RQCode

    ylbtech-Nuget:QRCode 1.返回顶部 1. https://www.nuget.org/packages?q=qrcode 2. 2.qrcode.js返回顶部 1. https:/ ...

  10. 01_SQlite数据库简介