LeetCode86. 分隔链表

LeetCode86. 分隔链表

题目说明

/**
     *
     * 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,
     * 使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
     * <p>
     * 你应当 保留 两个分区中每个节点的初始相对位置。
     *
     */

思路分析

  1. 题目要求将给定链表按一特定值分隔开,使得前半部分节点的值小于这一特定值,后半部分的值大于等于特定值
  2. 可以再定义两个节点,重新构建两条链表,一条链表用于连接比特定值小的节点,而另一链表用于连接比特定值大的链表
  3. 那么只需要对原始链表进行一次遍历,每次判断当前节点的值和特定值的大小关系,然后将其节点连接到不同的链表上
  4. 遍历结束后,已然形成两条链表,然后将这两条链表连接起来即可
  5. 注意链表的链式存储结构,一个节点可能还包含其他节点的引用,即一个节点可能还连接着其他节点,在某些情况下需要置空
  6. 源码见下

源码及分析

/**
     *
     * @param head 链表头节点
     * @param x 特定值x
     * @return 返回处理后的链表
     */
    public ListNode partition(ListNode head, int x) {
        //如果头节点为空或者只有一个节点,直接返回本身
        if (head == null || head.next == null) {
            return head;
        }
        //创建两条链表,一条用于存储比x值小的节点,一条用于存储比x值大的节点
        ListNode smallDummy = new ListNode();
        ListNode bigDummy = new ListNode();
        //创建辅助指针用于构建两条链表
        ListNode cur1 = smallDummy;
        ListNode cur2 = bigDummy;
        //遍历原始链表
        while (head != null){
            //如果当前位置head的值小于x,将当前节点连接到smallDummy
            if (head.val < x){
                cur1.next = head;
                cur1 = cur1.next;
            }else {
                //否则将当前节点连接到bigDummy
                cur2.next = head;
                cur2 = cur2.next;
            }
            //head后移
            head = head.next;
        }
        //将cur2指针后边置空,因为后边可能还连接着其他节点
        //注意链表的链式存储机制
        cur2.next = null;
        //将两条链表连接起来
        cur1.next = bigDummy.next;
        return smallDummy.next;
    }
posted @ 2021-06-15 09:07  mx_info  阅读(33)  评论(0)    收藏  举报