[英]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.