2008-08-13 5 views
129

Java에서 연결된 목록을 만드는 가장 좋은 방법은 무엇입니까?Java로 연결된 목록 데이터 구조를 만들려면 어떻게해야합니까?

+30

링크 된 목록을 만드는 가장 좋은 방법은 링크 된 목록에 내장 된 사용하는 것입니다해야한다고 생각합니다. 내장 클래스를 다시 작성하지 마십시오. –

+19

이 질문은 프로그래머 토론을위한 합법적이고 건설적인 것입니다. – anshulkatta

답변

213

자바에 익숙한 개발자들에게 확실한 해결책은 이미 java.util의 에서 제공하는 LinkedList의 클래스를 사용하는 것입니다. 그러나 어떤 이유로 든 구현을 직접 만들고 싶다고 가정 해보십시오. 다음은 목록의 시작 부분에 새 링크를 삽입하고 목록의 시작 부분에서 삭제하고 목록을 반복하여 포함 된 링크를 인쇄하는 링크 된 목록의 빠른 예입니다. 향상이 구현, 그리고 뿐만 아니라종류 방법을 얻을 추가하여중간 또는 끝에서을 삭제 삽입에 방법을 추가, 그것을 이중 연결리스트 만들기 등이 있습니다.

: 예에서, 링크 객체가 실제로 다른 링크 개체가 포함되어 있지 않습니다 - 넥스트 링크 실제로 다른 링크 만 참조입니다. 당신이 쓸 것입니다 것보다 아마 훨씬 더 최적화 때문에

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'의 내부 클래스 일 때 존경받을 수 있습니다. 자바가 다른 버전의 것 인 것처럼 작성된 또 다른 코드 모음입니다. – Bart

54

Java는 LinkedList 구현을 가지고 있으므로 체크 아웃 할 수 있습니다. JDK와 그 소스는 java.sun.com에서 다운로드 할 수 있습니다.

+0

Java의 Linkedlist에서 임의의 위치에 요소를 삽입하고 제거 할 수 있습니까? –

+8

링크드리스트의 요점은 아닌가? – jrockway

+1

@Seun Osewa 임의의 위치에 추가하고 싶다면 pls는 ArrayList를 사용합니다 :) – headgrowe

9

그것의 더 나은이되는 java.util.LinkedList를 사용합니다.

+14

그리고 처음으로 작동합니다. –

17

위의 링크 된 목록은 반대 방향으로 표시됩니다. 나는 삽입 방법의 올바른 구현

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; 
      } 
     } 
    } 
}