簡體   English   中英

在Java鏈表中排序

[英]sorting in java linked list

我試圖在Java中實現鏈表。 我正在嘗試對其進行排序。

該程序如下

class Link{
int data1;
String data2;
Link nextLink;

Link(int d1, String d2){
    data1=d1;
    data2=d2;
    nextLink=null;
}

void printLink(){
    System.out.println("{"+data1+", "+data2+"}");
}
}

class LinkList{
Link first;

LinkList(){
    first=null;
}

void insert(int d1, String d2){
    Link list=new Link(d1,d2);
    list.nextLink=first;
    first=list;
}

void printList(){
    Link currentLink=first;
    while(currentLink!=null){
        currentLink.printLink();
        currentLink=currentLink.nextLink;
    }
}
}

public class men{
    public static void main(String args[]){
        LinkList l1= new LinkList();
        l1.insert(10,"ABC");
        l1.insert(20,"DEF");
        l1.printList();
    }
}

我想按data1元素對其進行排序。

一種簡單的方法是從一個新的空列表開始,該列表將成為已排序的列表。 從原始列表中刪除節點,然后按順序插入新列表中。

最快的方法是自底向上合並排序的一種變體,它使用一個小的(26到32個)引用(指針)數組來排列列表的第一個節點,其中array [i]為0(空)或指向列表與2的冪i節點成正比。 將原始列表中的所有節點一次合並到一個數組中,然后將該數組合並以形成一個排序列表。 在此Wiki文章中,merge()函數合並兩個已經排序的列表,並處理一個或兩個列表為空的情況,以簡化主要代碼:

http://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists

我來晚了,但這是用java實現的。 希望能幫助到你。

 class men{
    public static void main(String args[]){
        LinkList l1= new LinkList();
        l1.insert(10,"ABC");
        l1.insert(20,"DEF");
        l1.insert(30, "GHI");
        l1.insert(40, "JKL");
        l1.insert(5, "hhh");
        l1.printList();
        mergesort(l1);
        System.out.println("After sorting: ");
        l1.printList();
    }

    private static void mergesort(LinkList l1) {
        // TODO Auto-generated method stub
        //Link curr=l1.first;

        if(l1.first!=null && l1.first.nextLink != null){
            Link middle= getMiddle(l1);

            if(middle == l1.first){
                //only two elements in the listt.just swap
                if(middle.data1>middle.nextLink.data1){

                    l1.first=l1.first.nextLink;
                    l1.first.nextLink=middle;
                    middle.nextLink=null;
                    //l1.printList();
                }
            }else{
                LinkList left=new LinkList();
                LinkList right=new LinkList();
                left.first=l1.first;
                right.first=middle.nextLink;
                middle.nextLink=null;

                mergesort(left);
                mergesort(right);

                Link cur_left=left.first;
                Link cur_right=right.first;
                l1.first=null;
                Link last=null;
                while(true){
                    if((cur_left !=null) && (cur_right !=null)){
                         if (cur_left.data1>cur_right.data1){
                             last=l1.insertAtLast(cur_right.data1, cur_right.data2, last);
                             cur_right=cur_right.nextLink;

                         }else{
                             last=l1.insertAtLast(cur_left.data1, cur_left.data2, last);
                             cur_left=cur_left.nextLink;
                         }
                    }else if(cur_left !=null){
                        last=l1.insertAtLast(cur_left.data1, cur_left.data2, last);
                        cur_left=cur_left.nextLink;
                    }else if(cur_right !=null){
                        last=l1.insertAtLast(cur_right.data1, cur_right.data2, last);
                        cur_right=cur_right.nextLink;
                    }else break;
                }
            }
        }
    }

    private static Link getMiddle(LinkList l1) {
        // TODO Auto-generated method stub
        if(l1.first== null){return l1.first;}
        Link slow,fast;
        slow=fast=l1.first;
        while(fast.nextLink !=null && fast.nextLink.nextLink !=null){
            slow=slow.nextLink;
            fast=fast.nextLink.nextLink;
        }
        return slow;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM