分隔链表

给定一个链表和一个特定值 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;
    }

 

posted on 2018-05-22 20:19  Deltadeblog  阅读(265)  评论(0编辑  收藏  举报

导航