今天是桀骜不驯的弗利沙大王!
正题
分隔链表
给你一个链表的头节点 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]
解析:
首先要读懂题, x 代表一个数值而非第几个节点,应题,要求将 val < x 和 >= x 的节点分别放在 x 左右两边,并且不改变他们的相对位置。也就是说,需要完成这个需求,要做到以下几点:
- 将val小于x的节点放在x左边
- 将val大于x的节点放在x右边
- 左右两边各自内部的原有相对位置
那么要解决这3点我们可以这么想:
- 找到val大于 x 的节点,并按顺序记录
- 找到val小于 x 的节点,并按顺序记录
- 重新按照顺序组合链表
假设小于x节点组成的链表是 less, 大于x节点组成的链表是 more
为了更好的帮助大家理解。老规矩,上图!
less 和 more 都是按照链表原有顺序进行合并成新链表的,也就是说自然就满足了 左右两边各自内部的原有相对位置
这个条件
虽然原理很简单,但是代码写起来可不是那么简单,需要注意什么是指针,什么是链表的节点,以及链表的单向性。大家可以结合注释参考我的实现。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} x
* @return {ListNode}
*/
var partition = function(head, x) {
let less = null // less 链表
let lessP = null // less 链表指针
let more = null // more 链表
let moreP = null // more 链表指针
let p = head // 原链表指针
while(p) {
if (p.val < x) {
if (less === null) {
less = p
lessP = less
} else {
lessP.next = p
lessP = lessP.next
}
} else {
if (more === null) {
more = p
moreP = more
} else {
moreP.next = p
moreP = moreP.next
}
}
p = p.next
}
// 处理边界问题
moreP ? moreP.next = null : ''
lessP ? lessP.next = more : less = more
return less
};