JS分隔链表

390 阅读2分钟

今天是桀骜不驯的弗利沙大王!

正题

分隔链表

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

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

示例 1:

image.png

输入: 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 左右两边,并且不改变他们的相对位置。也就是说,需要完成这个需求,要做到以下几点:

  1. 将val小于x的节点放在x左边
  2. 将val大于x的节点放在x右边
  3. 左右两边各自内部的原有相对位置

那么要解决这3点我们可以这么想:

  1. 找到val大于 x 的节点,并按顺序记录
  2. 找到val小于 x 的节点,并按顺序记录
  3. 重新按照顺序组合链表

假设小于x节点组成的链表是 less, 大于x节点组成的链表是 more

为了更好的帮助大家理解。老规矩,上图!

1.gif

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
};