2014-10-29 103 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); 
     } 
    } 

}