面试题 02.04. 分割链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。
示例 1:
输入: head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:
输入: head = [2,1], x = 2
输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
维护两个链表
思路
兄弟们大家好,这道题目其实就是让我们把链表重排一下,按照一个中间值来区分小的部分和大的部分
这里我们直接维护两个链表不就完事了,开搞开搞
我们直接new两个拥有虚拟头结点的链表left和right,表示链表的左半部分和右半部分
然后声明两个指针来分别指向left和right的末尾结点,方便衔接节点
准备就绪,开始干(遍历),处理每一个节点:
- 当前节点(的值,好家伙,可别用节点去比较,会err)小于x,那么久拼接在left链表上,更新min指针的位置
- 当前节点(的值)大于等于x,那么久拼接在right链表上,更新max指针的位置
处理完毕大功告。。。(还差最后一步别急啊)
两个链表要接起来啊
直接想法当然就是left链表的末尾指针直接接在right链表头结点上(大聪明,真有你的)
只不过我们是不是要考虑一下:
right链表的max(末尾)节点是否指向空了(null)呢?当然不一定喽!
- right链表如果正常有值衔接上去,那么很可能是原链表的中间节点,这时候要处理一下max的next指针指向null
- right链表如果一个节点呢,那不就是空吗,不用处理了,真好
所以我们就要判断一下max有值就处理一下
这不就得到了我们心心念念的答案了吗 嘿嘿嘿!
var partition = function(head, x) {
var left = new ListNode('left')
var min = left
var right = new ListNode('right')
var max = right
while(head){
if(head.val<x) {
min.next = head
min = head
}else {
max.next = head
max = head
}
head=head.next
}
min.next = right.next
if(max) max.next = null
return left.next
};