分隔链表

Posted Delta

tags:

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

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

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

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

 

 

解决思路:


从左向右遍历链表,将节点值小于x的节点交换至链表的前端,使用tag指向前端最后一个节点。

代码如下:

    public static ListNode partition(ListNode head, int x) {

        if (head==null || head.next==null) return head;

        ListNode h = new ListNode(0);
        h.next = head;

        ListNode temp;
        ListNode p = h;
        ListNode tag = h;
        while (p.next != null) {
            if (p.next.val < x) {
                if (tag == p) {
                    p = p.next;
                    tag = tag.next;
                }
                else {
                    temp = p.next;
                    p.next = temp.next;
                    temp.next = tag.next;
                    tag.next = temp;
                    tag = temp;
                }
            }
            else
                p = p.next;
        }
        return h.next;
    }

 

另一种方法是生成两个子链表,其中一个的节点值都小于x,另一个都大于等于x。

代码如下:

    public static ListNode test(ListNode head, int x) {

        ListNode h1 = new ListNode(0);
        ListNode l1 = h1;
        ListNode h2 = new ListNode(0);
        ListNode l2 = h2;

        while(head != null) {
            if (head.val < x) {
                l1.next = head;
                l1 = l1.next;
            }
            else {
                l2.next = head;
                l2 = l2.next;
            }
            head = head.next;
        }
        l2.next = null;
        l1.next = h2.next;
        return h1.next;
    }

 

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

[M链表] lc725. 分隔链表(模拟+代码优化+代码实现)

[M链表] lc725. 分隔链表(模拟+代码优化+代码实现)

分隔链表--均分链表指针返回

如何隐藏片段中首选项之间的分隔符

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

LeetCode86. 分隔链表