题目描述

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

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

示例:

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

解题思路

采用双指针思想,维护left指针作为前面的插入指针,right作为后面的删除指针。此时分为两种情况:

  • 若链表首节点值大于或等于给定值,则应首先找到其后第一个小于给定值的节点删除并插入到right之前作为头节点,并令left指向它,然后将right指向原删除节点的下一个节点
  • 若链表首节点值小于给定值,那么首先找到从左往右第一个大于或等于给定值的节点right,并令left指向其前一个节点

这样从right开始依次向后遍历,每次找到一个小于给定值的节点,就将其删除并插入到left指向节点之后,然后令left指针右移一位,直到right指向NULL

代码

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
if(head == NULL) return NULL;
ListNode *left = head, *right, *pre;
if(left->val >= x){
pre = left;
right = pre->next;
while(right){
if(right->val < x){
pre->next = right->next;
right->next = left;
head = left = right;
right = pre->next;
break;
}
pre = right;
right = right->next;
}
if(right == NULL) return head;
}
else{
while(left->next && left->next->val < x)
left = left->next;
right = left->next;
if(right == NULL) return head;
pre = right;
}
while(right){
if(right->val < x){
pre->next = right->next;
right->next = left->next;
left->next = right;
left = right;
right = pre->next;
continue;
}
pre = right;
right = right->next;
}
return head;
}
};

最新文章

  1. java jdbc的优化之BeanUtils组件
  2. [Operate System &amp; Algorithm] 页面置换算法
  3. Informatica Lookup Transformation组件的Connect 与Unconnected类型用法
  4. C 文件读写 容易疏忽的一个问题
  5. 网络爬虫urllib2 tornado
  6. Deep Learning 在中文分词和词性标注任务中的应用
  7. leetcode:Rotate List
  8. Asp.Net 之 WebService部署到服务器后出现&quot; The test form is only available for requests from the local machine &quot;
  9. (摘)Chart属性设置
  10. NHibernate:教你如何搭建数据访问层?
  11. bzoj3112 [Zjoi2013]防守战线
  12. 08-图8 How Long Does It Take
  13. uni-app 引入本地iconfont的正确姿势以及阿里图标引入
  14. BUAAOO-Second-Summary
  15. What’s new for Spark SQL in Apache Spark 1.3(中英双语)
  16. TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add(转)
  17. 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,
  18. git 撤销上一次 commit
  19. SVN checkout 功能不可用 右键只看到提交和更新,没有显示checkout
  20. 利用adb截屏

热门文章

  1. js二维数组转一维数组
  2. 关于Webpack打包报错Class constructor FileManager cannot be invoked without &#39;new&#39;
  3. 使用dockerfile构建nginx镜像 转
  4. kbmMWClientQuery判断一个字段是否修改?
  5. SQL Server 2005 实现数据库同步备份 过程--结果---分析
  6. Java反射【三、方法的反射】
  7. KMS激活的密钥
  8. 第十一章&#183; MHA高可用及读写分离
  9. LNMP安装与配置之CentOS7的安装。
  10. Python Memcached、Redis &amp; RabbitMQ使用