前端算法小白攻略10-leetcode(分隔链表-86)

79 阅读2分钟

问题前置

如何让链表按照我们给定的数值进行节点划分呢,比如head=[1,4,3,2,5,2] 给定数值x=3,让head=>>[1,2,2,4,3,5],大于3的节点在左边部分,小于3的在右边部分,而且节点的相对位置不变?

题目描述

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

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

示例 1:

image.png

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

解题思路

  1. 既然要分隔链表,那么其实相当于有两个部分的链表拼接成的,一部分是小于x的,另一部分大于等于x
  2. 那么我们就定义两个链表先把小于x和大于等于x的节点存起来,最后让小于x的尾节点连接大于等于x链表的头节点即可
  3. 要保证保留每个节点的初始相对位置,只要按照原链表的遍历顺序给两个新链表赋值即可

开始解题

var partition = function(head, x) {
    if(!head) return null;
    let smallNode = new ListNode(), bigNode = new ListNode(),cur = head;
    let small = smallNode, big = bigNode; //定义两条链表及对应的操作指针
    while(cur) {
        if(cur.val < x) {
            small.next = cur; // 让小于x的节点变成small的下一个节点
            small = cur;
        }else {
            big.next = cur;
            big = cur;
        }
        let next = cur.next; //保存cur.next,因为我们要把cur对应的节点断开存到新链表中,那么需要有指针保存cur后面的节点
        cur.next  = null; // 让cur断开与原链表的指针指向null,这个时候cur对应的节点就被放到了先链表中
        cur = next;
    }
    small.next = bigNode.next; // small指针停留在尾节点,指向bigNode的下个节点即可;
    return smallNode.next;
};