2014-10-29 4 views
1

나는 링크 된 목록을 배우고 있으며 기초를 이해하기위한 샘플 코드를 작성했습니다. 내 코드는 작동하지만 while 루프없이 for 루프를 사용하여 목록을 인쇄하는 또 다른 방법이 있습니까?for 루프를 사용하여 연결된 목록 인쇄

나는 목록에서 노드의 수를 이미 알고 있었기 때문에 내가 만든 for 루프를 사용하여 속이고있다. for 루프를 사용하여 목록을 인쇄하는 다른 방법이 있습니까? 즉 while 루프를 사용하여 목록을 인쇄 할 때 current을 초기화하는 방법이기 때문에,

for (FriendNode current=g; current != null; current = current.next) { 
    System.out.println(current); 
} 

g가 첫 번째 노드로 가정한다 :

public class FriendNode { 
FriendNode next; 
String name; 

FriendNode(String name) 
{ 
    this.name = name; 
    this.next = null; 
} 

public FriendNode(String name, FriendNode n) 
{ 
    this.name = name; 
    this.next = n; 
} 
public FriendNode getNext() 
{ 
    return this.next; 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    FriendNode g = new FriendNode("Bob"); 
    FriendNode o = new FriendNode("Alice"); 
    FriendNode k = new FriendNode("Tom"); 
    FriendNode m = new FriendNode("Day"); 
    g.next = o; 
    o.next = k; 
    k.next = m; 
    m.next = null; 
    FriendNode current=g; 
    while(current!=null) 
    { 
     System.out.println(current); 
     current = current.next; 
    } 
    for(int i =0; i<4;i++) 
    { 
     System.out.println(current); 
     current = current.next; 
    } 
} 
} 
+0

각 루프 반복자 또는를 사용합니다. – Madusudanan

+0

두 번째 루프는'current'를 역 참조하기 때문에'NullPointerException'을 던지는 것처럼 보이지만 첫 번째 루프는'current'가'null'이 될 때까지 종료되지 않습니다. –

답변

3

당신은이 방법을 수행 할 수 있습니다.

초기화 및 증분이 for 표현식으로 이동된다는 점을 제외하고는 while 루프와 동일하게 작동합니다.

+0

감사합니다. while이나 for 루프를 사용하여 목록을 인쇄하는 데 차이가 있습니까? – user3497437

+0

@ user3497437 두 코드가 같은 코드이기 때문에 그렇게 생각하지 않습니다. – Eran

3

for 루프는 int와 순전히 작동 할 필요가 없으며 증가 또는 감소해야합니다. 이것은 또한 유효합니다

for (FriendNode ii = g; ii != null; ii = ii.next) 
{ 
    System.out.println(ii); 
} 

모두 잠재적 인 문제,하지만 당신은 무한 루프의 위험을 실행하는 것이 - 당신은 g에 m.next를 설정하면, while 루프와 실행됩니다 루프를 모두 영원히. 필요한 경우, 시작한 FriendNode (g)에 대한 참조를 유지하고 i가 g 인 경우 루프에서 벗어나는 것이 좋습니다.

+0

감사합니다. while 또는 for 루프를 사용하면 큰 차이가 있습니다. – user3497437

0

당신의 Iterable을 구현하고 나는 FriendNode 사용하는 FriendList을 만든

for (Friend f : new FriendList(g)) { 
     System.out.println(f.name); 
    } 

루프

에 대한의 "다른 종류"를 사용할 수 있습니다. 그리고 문자열이 아닌 FriendNode 안에 Friend 개체를 붙이십시오. IMO는 앞으로 나아갈 수있는 확장 성을 제공 할 것입니다.

구현은 다음과 같습니다

import FriendList.Friend; 


public class FriendList implements Iterable<Friend> { 

    public static class Friend { 
     public Friend(String name) { 
      this.name = name; 
     } 

     String name; 
    } 

    public static class FriendNode { 
     FriendNode next; 
     Friend friend; 

     FriendNode(String name) 
     { 
      this.friend = new Friend(name); 
      this.next = null; 
     } 

     public FriendNode(String name, FriendNode n) 
     { 
      this.friend = new Friend(name); 
      this.next = n; 
     } 
     public FriendNode getNext() 
     { 
      return this.next; 
     } 
    } 

    public FriendList(FriendNode n) { 
     first = n; 
    } 

    @Override public Iterator<Friend> iterator() { 
     return new Iterator<Friend>() { 

      FriendNode node = first; 

      @Override public boolean hasNext() { 
       return node != null; 
      } 

      @Override public Friend next() { 
       Friend f = node.friend; 
       node = node.next; 
       return f; 
      } 

      @Override public void remove() { 
       throw new UnsupportedOperationException(); 
      } 
     }; 
    } 

    FriendNode first; 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     FriendNode g = new FriendNode("Bob"); 
     FriendNode o = new FriendNode("Alice"); 
     FriendNode k = new FriendNode("Tom"); 
     FriendNode m = new FriendNode("Day"); 
     g.next = o; 
     o.next = k; 
     k.next = m; 
     m.next = null; 

     FriendList list = new FriendList(g); 

     for (Friend f : list) { 
      System.out.println(f.name); 
     } 
    } 

} 
관련 문제