力扣第八十六题-分隔链表

183 阅读3分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

前言

力扣第八十六题 分隔链表 如下所示:

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

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

示例 1:

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

一、思路

这一题我刚开始想的是只需要一个 空链表 就可以了,将那些大于等于目标值移动到空链表中。后来写了很久才发现,如果链表一开始的节点的值就需要移动到空链表中,就无法正常的更新整个原先的链表了。

举个例子:当 head = [1, 2, 3], x = 2 时,你无法讲原链表的指针指向最后一个节点 3

于是,我就是用了两个 空链表,一个用来存储 大于等于目标值的节点,另一个用来存储 小于目标值的节点

实现起来还是比较容易的,大致的步骤如下:

  1. 初始化两个空链表 newHeadnewTail,分别表示新链表的前面部分和后面的部分。
  2. 使用指针 next 开始遍历链表 head
  3. 只要 next.val >= target 就将 next 节点加入链表 newTail
  4. 只要 next.val < target 就将 next 节点加入链表 newHead
  5. 拼接结果,将 newHeadCurrent.next = newTail.nextnewHeadCurrent 为链表的最后一个节点),然后返回 newHead.next 即可

注意:因为新建的两个链表的首节点都是无用的,所以在拼接结果时,要记得讲这两个首节点丢弃掉

举个例子

此处以实例中的 head = [1,4,3,2,5,2], x = 3 作为例子

  1. next 指向第一个元素,因为 1 < 3,将节点加入 newHead,此时 newHead:0 -> 1 (新链表首节点为 0)
  2. next 指向第二元素,因为 4 > 3,将节点加入 newTail,此时 newTail:0 -> 4 (新链表首节点为 0)
  3. next 指向第三元素,因为 3 == 3,将节点加入 newTail,此时 newTail:0 -> 4 -> 3
  4. next 指向第四元素,因为 2 < 3,将节点加入 newHead,此时 newHead:0 -> 1 -> 2
  5. next 指向第五元素,因为 5 > 3,将节点加入 newTail,此时 newTail:0 -> 4 -> 3 -> 5
  6. next 指向第六元素,因为 2 < 3,将节点加入 newHead,此时 newHead:0 -> 1 -> 2 -> 2
  7. 拼接结果 newHeadCurrent.next = newTail.next,此时 newHead:0 -> 1 -> 2 -> 2 -> 4 -> 3 -> 5
  8. 返回 newHead.next,即:newHead:1 -> 2 -> 2 -> 4 -> 3 -> 5

二、实现

实现代码

实现代码与思路中保持一直

    public ListNode partition(ListNode head, int x) {
        // 大于目标值的头节点
        ListNode tailHead = new ListNode();
        ListNode tailHeadCurrent = tailHead;
        ListNode newHead = new ListNode();
        ListNode newHeadCurrent = newHead;
        ListNode next = head;
        while (next != null) {
            if (next.val >= x) {
                // 只要next的值大于或等于目标值,就加入新的头节点
                while (next != null && next.val >= x) {
                    tailHeadCurrent.next = next;
                    tailHeadCurrent = tailHeadCurrent.next;
                    next = next.next;
                }
            } else {
                newHeadCurrent.next = next;
                newHeadCurrent = newHeadCurrent.next;
                next = next.next;
            }
        }
        tailHeadCurrent.next = null;
        newHeadCurrent.next = null;
        newHeadCurrent.next = tailHead.next;
        return newHead.next;
    }

测试代码

    public static void main(String[] args) {
        ListNode listNode = new ListNode(1, new ListNode(4, new ListNode(3, new ListNode(2, new ListNode(5, new ListNode(2 ))))));
        ListNode listNode1 = new ListNode(2, new ListNode(4));
        new Number86().partition(listNode, 3);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~