划分链表(Partition List)

对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。

思路:

采用双指针思想,维护node1指针作为前面的插入指针,node2作为后面的删除指针。此时分为两种情况:

  • 若链表首节点值大于或等于给定值,首先找到其后第一个小于给定值的节点删除并插入到 node2 之前作为头节点,并令 node1 指向它,然后将 node2 指向原删除节点的下一个节点
  • 若链表首节点值小于给定值,那么首先找到从左往右第一个大于或等于给定值的节点 node2,并令 node1 指向其前一个节点

这样从 node2 开始依次向后遍历,每次找到一个小于给定值的节点,就将其删除并插入到 node1 指向节点之后,然后令 node1 指针右移一位,直到 node2 指向NULL

//思路:一拆为二然后合并
function partition(head, x) {
    //node1记录当前最新的小于x的值,node2记录当前最新的大于等于x的值
    let node1 = new ListNode(0), node2 = new ListNode(0);
    //cur1指向表头,cur2指向第一个大于等于x的值得位置
    let cur1 = node1, cur2 = node2;
    while (head != null) {
        if (head.val < x) {
            node1.next = head;
            node1 = node1.next;
        } else {
            node2.next = head;
            node2 = node2.next;
        }
        head = head.next;
    }
    node1.next = cur2.next;
    node2.next = null;  //以null结尾
    return cur1.next;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值