CC11:链表分割
题目
编写代码,以给定值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:链表分割的更多相关文章
- cc150 --链表分割
题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...
- 链表分割——牛客剑指offer
题目描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...
- 链表分割 牛客网 程序员面试金典 C++ Python
链表分割 牛客网 程序员面试金典 C++ Python 题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* p ...
- 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 ...
- 面试题目——《CC150》链表
面试题2.1:编写代码,移除未排序链表中的重复结点 进阶:如果不得使用临时缓冲区,该怎么解决? package cc150; import java.util.HashMap; import java ...
- linux内核之链表操作解析
本文只是对linux内核中的链表进行分析.内核版本是linux-2.6.32.63.文件在:linux内核/linux-2.6.32.63/include/linux/list.h.本文对list.h ...
- 【Cracking the Code Interview(5th edition)】二、链表(C++)
链表结点类型定义: class Node { public: ; Node *next = nullptr; Node(int d) { data = d; } }; 快行指针(runner)技巧: ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- 二刷Cracking the Coding Interview(CC150第五版)
第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...
随机推荐
- matlab之mean()函数
mean(A,1):沿着第一维(列)求平均值: mean(A,2):沿着第二维(行)求平均值: 举例: Z=[1 2 3;4 5 6]; >> mean(Z,1) ans = 2.5000 ...
- leetcode 110 Balanced Binary Tree(DFS)
Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...
- 【C++ Primer 5th】Chapter 15
摘要: 1. 面向对象程序设计的核心思想是数据抽象.继承和动态绑定.数据抽象将类的接口和实现分离:继承定义相似的类型并对齐相似关系建模:动态绑定,在一定程度上忽略相似类型的区别,而以统一的方式使用它们 ...
- RMAN兼容性、控制文件自动备份、保存时间、备份策略、备份脚本(二)
RMAN 程序的兼容性 RMAN 环境由以下5部分组成:(1) RMAN executable(2) Recovery catalog database(3) Recovery catalog sch ...
- HDU3991:Black and White
浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:http://acm.hdu.edu.cn/showproblem.php? ...
- Ubuntu 复制文件,修改文件名
复制 cp a b (a为旧的,b为新的) 修改 mv a b (a为旧的,b为新的)
- java项目文件的路径问题
title: 项目下的路径问题 tags: grammar_cjkRuby: true --- 在javaee的项目中,存取文件,解析xml和properties文件,以及项目中的文件,都需要获取路径 ...
- 6 git 生成SSH公钥/私钥 查看公钥
如果没有公钥的话就生成公钥私钥: $ ssh-keygen 然后连续回车(一次是位置,两次密码)
- chromium浏览器开发系列第四篇:如何调试最新chromium
接二连三的事情,时间比较紧张,但是还是没有把这个系列的文章丢掉,因为这也是对自己知识的总结吧.提倡大家多写写,以后再看的时候会有种莫名的小激动. 上周写的是chromium的目录结构,好像大家不太感兴 ...
- WPF中数据绑定问题
在数据库中字段不区分大小写,可以页面是区分的,一开始以为不区分,可我从数据库查出了数据在前台就是不显示想了半天才发现的. <sdk:DataGrid FrozenColumnCount =&qu ...