[路飞]_算法·每日解读--分隔链表

164 阅读1分钟

题解86: 分隔链表

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

示例:

img

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

题意解读:

  • 分隔,将链表依据给定的值( x )进行大小分割排列,将小于 x 的节点放在大于或等于 x 的节点之前
  • 既然是排列比较,那边需要对链表进行循环比较,将满足条件的节点依次向前移位
  • 也可以完全进行递增排序也行
  • 如若非必须可创建新链表进行对应存储
var partition = function (head, x){
    if(!head) return null;
    let bigList = new ListNode(),       //创建两个新的链表分别存储大值和小值
        smallList = new ListNode();
    let bigNode = bigList, smallNode = smallList;   //定义节点指向
    let cur = head, next;
    while(cur){
        next = cur.next;    //将cur.next赋给next指针,防止丢失
        cur.next = null;    //将cur.next指向为null,剥离出来单独操作
        if(cur.val < x){    //节点值比较
            smallNode.next = cur;   //节点拼接,将smallNode节点next指向cur
            smallNode = cur;        //完成指向后,移动smallNode的节点指向,后移
        }else{
            bigNode.next = cur;     //同上
            bigNode = cur;
        }
        cur = next;     //,改变节点指向,后移
    }
    smallNode.next = bigList.next;  //进行链表拼接,bigList.next为首节点(要分清)
    return smallList.next;
}

依次比较,依次分类添加(循环量表的时候采用 while 循环,非空即继续)

👆 👆 以上就是个人对【分隔链表】的代码解法和方法解读。

迷惑重重,一看上头,一键三连哟!!!