將單向鏈表按某值劃分成左邊小,中間相等、右邊大的形式

  • 問題描述

將單向鏈表按某值劃分成左邊小,中間相等、右邊大的形式。

  • 解決方案1

將單鏈錶轉換成數組,然後按照數組的方式進行partion分組,小的在頭,大的在尾。注意這種方法會改變原來鏈表中數據的相對順序。

/**
     * 將單鏈錶轉換成數組,然後進行partion分組,小的在頭,大的在尾
     * @param head
     * @param standard
     */
    public static Node partionLinkedList1(Node head,Node standard){
        if(head == null)
            return null;
        Node cur = head;
        int len = 0;
        while(cur != null){
            len ++;
            cur = cur.next;
        }
        Node[] arr = new Node[len];
       cur = head;
       int index = 0;
        while(cur != null){
           arr[index] = cur;
            cur = cur.next;
            index ++;
        }
        //數組partion過程
        int small = -1;
        int big = len;
        for(int i = 0;i < big;i ++){
            if(arr[i].value < standard.value){
                small ++;
                Node temp = arr[i];
                arr[i] = arr[small];
                arr[small] = temp;
            }
            else if(arr[i].value > standard.value){
                big --;
                Node temp = arr[i];
                arr[i] = arr[big];
                arr[big] = temp;
                i --;
            }
        }
        Node res = arr[0];
        for(int i = 0;i < len - 1;i ++){
            arr[i].next = arr[i + 1];
        }
        arr[len - 1].next = null;
        return res;
    }
  • 解決方案2

將將單鏈表拆成比比較值小的small鏈表,相等的equal鏈表和大的big鏈表,然後將三個鏈表進行合併,注意邊界條件,鏈表是否爲空。這種方法不會改變原來鏈表中數據的相對順序。

 /**
     * 將單鏈表拆成small,equal,big三個鏈表,然後將三個鏈表進行合併
     * @param head
     * @param standard
     */
    public static Node partionLinkedList2(Node head,Node standard){
        if(head == null)
            return null;
        Node small = new Node();
        Node smallTail = small;
        Node equal = new Node();
        Node equalTail = equal;
        Node big = new Node();
        Node bigTail = big;
        Node cur = head;
        while(cur != null){
            if(cur.value < standard.value){
                smallTail.next = cur;
                smallTail = smallTail.next;
            }
            else if(cur.value > standard.value){
                bigTail.next = cur;
                bigTail = bigTail.next;
            }
            else{
                equalTail.next = cur;
                equalTail = equalTail.next;
            }
            cur = cur.next;
        }
        smallTail.next = equal;
        equalTail.next = big;
        cur = small;
        //刪去equal和big節點
        while(cur != null){
            if(cur.next == big || cur.next == equal){
                cur.next = cur.next.next;//刪去哨兵節點
            }
            else
                cur = cur.next;
        }
        //返回small.next,跳過small節點
        return small.next;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章