码迷,mamicode.com
首页 > 其他好文 > 详细

分隔链表

时间:2018-05-22 22:08:52      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:temp   ima   遍历   输出   ext   src   链表   ati   lse   

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

 

分隔链表

标签:temp   ima   遍历   输出   ext   src   链表   ati   lse   

原文地址:https://www.cnblogs.com/deltadeblog/p/9073856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!