2014-10-29 70 views
1

我在學習鏈表,並編寫了一個示例代碼來了解基本原理。我的代碼工作,但有沒有另一種方式來打印列表使用for循環沒有while循環?在java中使用for循環打印鏈表

我使用for循環作弊,因爲我已經知道列表中的節點數。使用for循環打印列表有不同的方法嗎?

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 2014-10-29 06:40:01

+0

你的第二個循環看起來會拋出一個'NullPointerException',因爲它取消了'current',但是第一個循環直到'current'爲'null'纔會退出。 – 2014-10-29 06:41:27

回答

3

你可以這樣來做:

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

這是假設g是第一個節點,因爲這是印刷與while循環列表時,你如何初始化current

除了初始化和增量被移動到for表達式之外,它基本上和while循環一樣,它使它更緊湊。

+0

謝謝。使用while或for循環打印列表是否有區別。 – user3497437 2014-10-29 06:49:53

+0

@ user3497437我不這麼認爲,因爲它是用兩種不同的方式編寫的相同代碼。 – Eran 2014-10-29 06:51:29

3

for循環不必純粹用ints工作,也不必遞增或遞減。這也適用:

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

與兩個潛在的問題,不過,是你運行一個無限循環的風險 - 如果你設置m.next到克,兩者while循環和for循環將執行永遠。如果你需要的話,你可以通過保持對你開始使用的FriendNode(g)的引用來防止這種情況發生,並且如果我是g,則可以跳出循環。

+0

謝謝。它使用while或for循環有一個主要區別 – user3497437 2014-10-29 06:48:16

0

可以實現Iterable並使用循環

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

我創建一個使用FriendNode一個FriendList的「其他類型」。並在FriendNode內部卡住Friend對象,而不僅僅是一個字符串。國際海事組織將讓你更好的延展性前進。

實施看起來是這樣的:

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

}