首页 > 其他 > 详细

将单向链表按某值划分成左边小,中间相等,右边大的形式

时间:2019-10-09 20:54:10      阅读:101      评论:0      收藏:0      [点我收藏+]

第一种方法:准备三个队列,遍历链表时候,将小于的放入小于队列中,等于的放入等于队列中,大于的放入大于队列中,然后从队列中取出来重新连接

第二种方法:遍历链表,组成三个链表,重新连接  (只用到了有限的几个变量,额外空间复杂度是O(1))

/**
 *  1.将链表分为三部分:  small,equal,big
 *                 small:1->2->null
 *                 equal:5->5->null
 *                 big:9->8->null
 *  2.将small、equal、big三个链表重新串起来
 *  3.整个过程需要特别注意对null节点的判断和处理
 *
 */

public class SmallEqualBig {

    public static void main(String[] args) {

        Node head = new Node(1);
        head.next = new Node(2);
        head.next.next = new Node(9);
        head.next.next.next = new Node(5);
        head.next.next.next.next = new Node(5);
        head.next.next.next.next.next = new Node(8);
        display(head);
        //将链表打断后重新连接
        Node newHead = partition(head,5);
        display(newHead);
        
    }

   public static  void display(Node first) {
        StringBuilder sb = new StringBuilder();
        while (first != null) {
            sb.append(first.val + " -> ");
            first = first.next;
        }
        String res = sb.substring(0, sb.lastIndexOf(" -> "));
        System.out.println(res);
    }
    
    public static Node partition(Node head, int pivot) {

        // 将链表分为small、equal、big
        Node sH = null;
        Node sT = null;
        Node eH = null;
        Node eT = null;
        Node bH = null;
        Node bT = null;
        Node next = null;// 保存下一个节点

        // 将所有的节点依次保存在三个链表中
        while (head != null) {
            //保存下一个节点
            next = head.next;
            //将head节点指向null
            head.next = null;
            if (head.val < pivot) {
                if (sH == null) {
                    sH = head;
                    sT = head;
                } else {
                    sT.next = head;
                    sT = head;
                }
            } else if (head.val == pivot) {
                if (eH == null) {
                    eH = head;
                    eT = head;
                } else {
                    eT.next = head;
                    eT = head;
                }
            } else {
                if (bH == null) {
                    bH = head;
                    bT = head;
                } else {
                    bT.next = head;
                    bT = head;
                }
            }
            head = next;
        }

        // 小的和相等的重新连接
        if (sT != null) {
            sT.next = eH;
            //假如中间部分为空
            eT = eT == null ? sT : eT;
        }
        // 所有的重新连接
        if (eT != null) {
            eT.next = bH;
        }
        // 判断头节点是否为空,三个子链表,哪个部分不为null,就返回哪个
        return sH != null ? sH : eH != null ? eH : bH;
    }

    public static class Node {
        int val;
        Node next;

        public Node(int value) {
            this.val = value;
        }
    }

}

 

将单向链表按某值划分成左边小,中间相等,右边大的形式

原文:https://www.cnblogs.com/moris5013/p/11644127.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!