LeetCode- 86 -分隔链表 - Java - 细喔

Posted Dark And Grey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode- 86 -分隔链表 - Java - 细喔相关的知识,希望对你有一定的参考价值。

题目

这个题目中的 “分隔”并不是真正意义上分隔,将一个链表分隔成两个链表。
而是说 以一个整形数据x,让链表以 val 和 x 之间的大小差距进行数组分隔,val值小于x的节点,位于左边,大于和等于则位于整个链表的右边。
而且还有一个要求: 不能是 “无序的”,按照原有相对位置。
什么意思呢?假设 x == 3 , 第一个 节点的值 是 1,小于x值,而且本身就位于左边,我们就不用去移动它的位置了。这就是题目中 的 保留每个节点的初识相对位置,
再换一个说法 : 看到上面那个图中的 val 为 2 的节点没?它 和 val值为1的节点 ,val值都小于 x值(3),位于 链表的左边,但是由于它原先就位于 1 的右边,那么“分隔”后的结果 这个2节点 应该在 1 节点的后面。
这就是 保留 每个节点的初识相对位置。


解题思维

建立 两个傀儡头节点 small 和 large,small 用来连接 val 值小于x的节点,large 用来连接 val 值大于或等于的节点。
再为 small 和 large 两个头节点创建2个替身变量 smallHead 和 largeHead,让它们记住small 和 large 的头节点的位置,让small 和 large 去 连接/遍历 各自的链表。(嗯。好像对 small 和 large 不厚道,谁让新建的两个节点引用带个 头head 呢? 嗯 ,没错!是这样的。)


代码

class Solution 
    public ListNode partition(ListNode head, int x) 
        ListNode small = new ListNode();
        ListNode smallHead =  small;
        ListNode large = new ListNode();
        ListNode largeHead = large;
        while(head != null)
            if(head.val < x)
                small.next = head;
                small = small.next;
            else
                large.next = head;
                large = large.next;
            
            head = head.next;
        
        large.next = null;
        small.next = largeHead.next;
        return smallHead.next;
    

附图

以上是关于LeetCode- 86 -分隔链表 - Java - 细喔的主要内容,如果未能解决你的问题,请参考以下文章

算法千题案例每日LeetCode打卡——86.根据二叉树创建字符串

LeetCode Solution-86

[LeetCode]86. Partition List

LeetCode笔记:Biweekly Contest 86

LeetCode笔记:Biweekly Contest 86

Leetcode 86. Partition List