【问题标题】:sorting in java linked list在java链表中排序
【发布时间】:2016-02-20 13:13:05
【问题描述】:

我尝试在 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 元素对其进行排序。

【问题讨论】:

  • 这方面为什么不用数组列表,和你实现的一样,直接有排序方法或者可以使用迭代器对数组列表进行排序希望我的解释有帮助

标签: java sorting data-structures linked-list


【解决方案1】:

一种简单的方法是从一个新的空列表开始,该列表将成为排序列表。从原始列表中删除节点,然后按顺序插入到新列表中。

最快的方法是自下而上归并排序的一种变体,它使用一个小的(26 到 32)个引用(指针)数组指向已排序列表的第一个节点,其中 array[i] 为 0(空)或点到一个列表,其中包含 2 的 i 次幂节点。原始列表中的所有节点一次一个地合并到数组中,然后合并数组以形成单个排序列表。在这篇 Wiki 文章中,merge() 函数合并了两个已经排序的列表,并处理了一个或两个列表为空的情况以简化主要代码:

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

【讨论】:

    【解决方案2】:

    我迟到了,但这是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;
        }
    }
    

    【讨论】:

    • 我在 LinkList 类中添加了 insertAtLast 方法,以便最终插入节点。 Link insertAtLast(int d1,String d2,Link last){ Link toAppend=new Link(d1,d2); if(last==null)first=toAppend;否则 last.nextLink=toAppend;返回附加; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多