lintcode-96-链表划分
96-链表划分
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null标签
链表 两根指针
思路
遍历一次链表,使用常数级的额外空间,具体做法是:
使用两个指针lessNext,moreNext重新规划链表。使比 x 小的节点和比 x 大的节点重新组成两个新的链表,lessHead,moreHead是这两个新链表的头结点指针,然后,合并这两个链表即可。
code
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @param x: an integer
* @return: a ListNode
*/
ListNode *partition(ListNode *head, int x) {
// write your code here
if(head == NULL) {
return head;
}
ListNode *lessHead = NULL, *lessNext = NULL;
ListNode *moreHead = NULL, *moreNext = NULL;
ListNode *current = head;
bool isLessHead = true, isMoreHead = true;
while(current != NULL) {
if(current->val < x) {
if(isLessHead){
lessHead = lessNext = current;
isLessHead = false;
}
else {
lessNext->next = current;
lessNext = lessNext->next;
}
}
else {
if(isMoreHead){
moreHead = moreNext = current;
isMoreHead = false;
}
else {
moreNext->next = current;
moreNext = moreNext->next;
}
}
current = current->next;
}
if(lessNext != NULL && moreNext != NULL) {
lessNext->next = moreHead;
moreNext->next = NULL;
return lessHead;
}
else if(lessNext == NULL){
moreNext->next = NULL;
return moreHead;
}
else if(moreNext == NULL) {
lessNext->next = NULL;
return lessHead;
}
}
};
lintcode-96-链表划分的更多相关文章
- lintcode :Partition List 链表划分
题目: 链表划分 给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前. 你应该保留两部分内链表节点原有的相对顺序. 样例 给定链表 1->4->3->2-& ...
- Lintcode 166. 链表倒数第n个节点
----------------------------------- 最开始的想法是先计算出链表的长度length,然后再从头走 length-n 步即是需要的位置了. AC代码: /** * De ...
- 【LintCode】链表求和
问题分析: 我们通过遍历两个链表拿到每个位的值,两个值加上前一位进位值(0或者1)模10就是该位的值,除以10就是向高位的进位值(0或者1). 由于两个链表可以不一样长,所以要及时判断,一旦为null ...
- 2.4---把链表划分为两部分(CC150)
注意,题目要求要保持两部分的相对顺序,所以,用交换是不行的. import java.util.HashSet; import java.util.Set; class ListNode{ int v ...
- [LintCode]删除链表中的元素
问题分析: 声明当前指针和上一个指针即可. 问题求解: public class Solution { public ListNode removeElements(ListNode head, in ...
- lintcode 466. 链表节点计数
466. 链表节点计数 计算链表中有多少个节点. 样例 给出 1->3->5, 返回 3. /** * Definition of ListNode * class ListNode ...
- LintCode:链表操作(合并与反转)
描述: (1)翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null ********************** ...
- LintCode之链表倒数第n个节点
题目描述: 我的代码: /** * Definition for ListNode. * public class ListNode { * int val; * ListNode next; * L ...
- Lintcode 翻转链表
翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 分析: /** * Definition of ListN ...
- [LintCode] 删除链表中倒数第n个节点
/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(in ...
随机推荐
- order by 排序
[order by] 排序 asc 升序(从小到大),desc降序(从打到小) 语法: select 列名 from 表 where 条件 order by 列1,列2 asc或d ...
- 2小时学会spring boot 以及spring boot进阶之web进阶(已完成)
1:更换Maven默认中心仓库的方法 <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirr ...
- java各种业务解决方案总结
最近有点时间,突然感慨良多,感觉辛苦工作这么久什么都没有,总结了以前的工作,将接触的主要工具列出来,希望给大家解决问题做参考.相关工具都是实践检验过的 1.数据库 (1).内存数据库 redis (2 ...
- mysql的密码忘记了,怎么办, 来来来.
尤其是在学习的过程, 也是天天和数据库打交道, 难免会有脑子短路的时候, 比如root密码忘记了, 你说怎么办~~~, 没关系, 往下看 mysql提供了一种跳过用户认证的配置, 参数, 你配置上这个 ...
- /etc/fstab开机自动挂载设备配置
第一列:设备名字(路径?) 第二列:设备挂载路径(挂载到的位置) 第三列:分区格式 第四列:文件系统参数(?) 第五列:是否自动dump备份 0 不要 1 定期 2 不定期 第六 ...
- Struts2拦截器说明
有关于Struts2的拦截器的原理 在此共设置了两个拦截器,firstInterception.SecondInterception package struts2_inteception; publ ...
- [转]App离线本地存储方案
App离线本地存储方案 原文地址:http://ask.dcloud.net.cn/article/166 HTML5+的离线本地存储有如下多种方案:HTML5标准方案:cookie.localsto ...
- Java基础——继承和多态
面向对象的编程允许从已经存在的类中定义新的类,这称为继承. 面向过程的范式重点在于方法的设计,而面向对象的范式将数据和方法结合在对象中.面向对象范式的软件设计着重于对象以及对象上的操作.面向对象的方法 ...
- python学习之对象的三大特性
在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...
- mysql 时间相关sql , 按天、月、季度、年等条件进行查询
#今天 select * from or_order_task where to_days(created_date)=to_days(now()); #近七天 select * day )<= ...