86. 分隔链表

92 阅读1分钟

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

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

var partition = function(head, x) {
    if(!head) return null;
    // 定义两个虚拟头结点
    let bigRet = new ListNode();
    let smallRet = new ListNode();
    // 定义两个指针,分别指向虚拟头
    let big = bigRet;
    let small = smallRet;
    let cur = head;
    while(cur){
        // 先保存下一个节点
        const next = cur.next;
        // 断开当前节点,使其成为一个孤立的节点
        cur.next = null;
        // 判断当前节点值
        // 如果小于x则连接在 samll链表中
        // 如果大于x则连接在 big链表中
        if(cur.val < x){
            small.next = cur;
            small = cur;
        }else{
            big.next = cur;
            big = cur;
        }
        // 当前cur指针移到下一个节点
        // next 事先已近保存
        cur = next;
    }
    // 小链表的尾部连接大链表头部
    small.next = bigRet.next;
    // 返回整个链表
    return smallRet.next
};