2008-08-13 13 views
129

Javaでリンクリストを作成する最適な方法は何ですか?Javaでリンクリストデータ構造を作成するにはどうすればよいですか?

+30

リンクリストを作るための最善の方法は、リンクされたリストに組み込まれて使用することであるべきだと思います。組み込みのクラスを書き直さないでください。 –

+19

この質問は正当であり、プログラマの話し合いのために建設的です。 – anshulkatta

答えて

213

Javaへのなじみの開発者への明白な解決策は、すでに java.utilので提供LinkedListのクラスを使用することです。しかし、何らかの理由で独自の実装をしたかったとします。ここでは、リストの先頭に新しいリンクを挿入し、リストの先頭から削除し、そのリストに含まれているリンクを印刷するためのリストをループするリンクリストの簡単な例を示します。この実装に強化を挿入し途中または最後からを削除し、同様とソートメソッドを取得追加することによって、にメソッドを追加し、それダブルリンクリスト行うことを含みます。

:例では、リンクオブジェクトは、実際には別のリンクオブジェクトが含まれていない - nextLinkは、実際に別のリンクへの参照のみです。それはあなたが書くだろうものよりも、おそらくはるかに最適化されますので、

class Link { 
    public int data1; 
    public double data2; 
    public Link nextLink; 

    //Link constructor 
    public Link(int d1, double d2) { 
     data1 = d1; 
     data2 = d2; 
    } 

    //Print Link data 
    public void printLink() { 
     System.out.print("{" + data1 + ", " + data2 + "} "); 
    } 
} 

class LinkList { 
    private Link first; 

    //LinkList constructor 
    public LinkList() { 
     first = null; 
    } 

    //Returns true if list is empty 
    public boolean isEmpty() { 
     return first == null; 
    } 

    //Inserts a new Link at the first of the list 
    public void insert(int d1, double d2) { 
     Link link = new Link(d1, d2); 
     link.nextLink = first; 
     first = link; 
    } 

    //Deletes the link at the first of the list 
    public Link delete() { 
     Link temp = first; 
     if(first == null){ 
     return null; 
     //throw new NoSuchElementException(); // this is the better way. 
     } 
     first = first.nextLink; 
     return temp; 
    } 

    //Prints list data 
    public void printList() { 
     Link currentLink = first; 
     System.out.print("List: "); 
     while(currentLink != null) { 
      currentLink.printLink(); 
      currentLink = currentLink.nextLink; 
     } 
     System.out.println(""); 
    } 
} 

class LinkListTest { 
    public static void main(String[] args) { 
     LinkList list = new LinkList(); 

     list.insert(1, 1.01); 
     list.insert(2, 2.02); 
     list.insert(3, 3.03); 
     list.insert(4, 4.04); 
     list.insert(5, 5.05); 

     list.printList(); 

     while(!list.isEmpty()) { 
      Link deletedLink = list.delete(); 
      System.out.print("deleted: "); 
      deletedLink.printLink(); 
      System.out.println(""); 
     } 
     list.printList(); 
    } 
} 
+7

intとdoubleを格納するのではなく、データ型にジェネリックを使用するようにこのコードを簡単に改善することもできます。 – shsteimer

+49

@shsteimer:かなり間違いなく、このコードの唯一の良い使い方は技術を実証することであるので、誰にも役立たないでしょう。それは基本的な考え方を拡散するだけです。 –

+7

'public Link nextLink'を持ち、それをクラス外で操作するのは良い方法ではありません。 'Link'が' LinkList'の内部クラスであるとき、それは尊敬することができます。これは、Javaが別のバージョンのof-cであったために書かれた別のコードです。 – Bart

54

JavaにはLinkedListの実装があり、チェックアウトしたい場合があります。 JDKは、java.sun.comにダウンロードできます。

+0

JavaのLinkedlistでは、任意の位置に要素を挿入したり削除したりすることはできませんか? –

+8

それはリンクリストの全体のポイントではありませんか? – jrockway

+1

@Seun Osewaもしあなたが任意の位置に追加したいなら、plsはArrayListを使ってください:) – headgrowe

22

java.util.LinkedListを使用してください。このように:

list = new java.util.LinkedList() 
9

そのはるかに良いが、java.util.LinkedListを使用します。

+14

これは初めて動作します。 –

17

上記のリンクリストは反対方向に表示されます。私は、insertメソッドの正しい実装が

public void insert(int d1, double d2) { 
    Link link = new Link(d1, d2); 

    if(first==null){ 
     link.nextLink = null; 
     first = link; 
     last=link; 
    } 
    else{ 
     last.nextLink=link; 
     link.nextLink=null; 
     last=link; 
    } 
} 
+1

別途記載のない限り、最後に追加します。 :-) –

7
//slightly improved code without using collection framework 

package com.test; 

public class TestClass { 

    private static Link last; 
    private static Link first; 

    public static void main(String[] args) { 

     //Inserting 
     for(int i=0;i<5;i++){ 
      Link.insert(i+5); 
     } 
     Link.printList(); 

     //Deleting 
     Link.deletefromFirst(); 
     Link.printList(); 
    } 


    protected static class Link { 
     private int data; 
     private Link nextlink; 

     public Link(int d1) { 
      this.data = d1; 
     } 

     public static void insert(int d1) { 
      Link a = new Link(d1); 
      a.nextlink = null; 
      if (first != null) { 
       last.nextlink = a; 
       last = a; 
      } else { 
       first = a; 
       last = a; 
      } 
      System.out.println("Inserted -:"+d1); 
     } 

     public static void deletefromFirst() { 
      if(null!=first) 
      { 
       System.out.println("Deleting -:"+first.data); 
       first = first.nextlink; 
      } 
      else{ 
       System.out.println("No elements in Linked List"); 
      } 
     } 

     public static void printList() { 
      System.out.println("Elements in the list are"); 
      System.out.println("-------------------------"); 
      Link temp = first; 
      while (temp != null) { 
       System.out.println(temp.data); 
       temp = temp.nextlink; 
      } 
     } 
    } 
} 
関連する問題