博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
划分链表(Partition List)
阅读量:4128 次
发布时间:2019-05-25

本文共 895 字,大约阅读时间需要 2 分钟。

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

思路:

采用双指针思想,维护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;}

 

转载地址:http://jnuvi.baihongyu.com/

你可能感兴趣的文章
飞机换乘次数最少问题的两种解决方案
查看>>
有向无回路图的理解
查看>>
设计模式中英文汇总分类
查看>>
WPF实现蜘蛛纸牌游戏
查看>>
单例模式
查看>>
工厂方法模式
查看>>
模板方法模式
查看>>
数据结构之队列、栈
查看>>
数据结构之树
查看>>
数据结构之二叉树
查看>>
二叉树非递归遍历算法思悟
查看>>
红黑树算法思悟
查看>>
从山寨Spring中学习Spring IOC原理-自动装配注解
查看>>
实例区别BeanFactory和FactoryBean
查看>>
Spring后置处理器BeanPostProcessor的应用
查看>>
Spring框架的ImportSelector到底可以干嘛
查看>>
Mysql中下划线问题
查看>>
微信小程序中使用npm过程中提示:npm WARN saveError ENOENT: no such file or directory
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>