LeetCode 86. 分隔链表(Partition List)
2024-08-30 16:21:12
题目描述
给定一个链表和一个特定值 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;
}
};
最新文章
- java jdbc的优化之BeanUtils组件
- [Operate System &; Algorithm] 页面置换算法
- Informatica Lookup Transformation组件的Connect 与Unconnected类型用法
- C 文件读写 容易疏忽的一个问题
- 网络爬虫urllib2 tornado
- Deep Learning 在中文分词和词性标注任务中的应用
- leetcode:Rotate List
- Asp.Net 之 WebService部署到服务器后出现"; The test form is only available for requests from the local machine ";
- (摘)Chart属性设置
- NHibernate:教你如何搭建数据访问层?
- bzoj3112 [Zjoi2013]防守战线
- 08-图8 How Long Does It Take
- uni-app 引入本地iconfont的正确姿势以及阿里图标引入
- BUAAOO-Second-Summary
- What’s new for Spark SQL in Apache Spark 1.3(中英双语)
- TensorFlow 辨异 —— tf.add(a, b) 与 a+b(tf.assign 与 =)、tf.nn.bias_add 与 tf.add(转)
- 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider,
- git 撤销上一次 commit
- SVN checkout 功能不可用 右键只看到提交和更新,没有显示checkout
- 利用adb截屏
热门文章
- js二维数组转一维数组
- 关于Webpack打包报错Class constructor FileManager cannot be invoked without &#39;new&#39;
- 使用dockerfile构建nginx镜像 转
- kbmMWClientQuery判断一个字段是否修改?
- SQL Server 2005 实现数据库同步备份 过程--结果---分析
- Java反射【三、方法的反射】
- KMS激活的密钥
- 第十一章&#183; MHA高可用及读写分离
- LNMP安装与配置之CentOS7的安装。
- Python Memcached、Redis &; RabbitMQ使用