我正在学习链表,并编写了一个示例代码来理解基本原理。我的代码是有效的,但是有没有其他方法可以使用for循环而不使用while循环来打印列表?
我用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;
}
}
}
您可以这样做:
for (FriendNode current=g; current != null; current = current.next) {
System.out.println(current);
}
这是假设g
是第一个节点,因为在使用while循环打印列表时就是这样初始化current
的。
它本质上与while循环相同,只是将初始化和增量移动到for
表达式,这使它更加紧凑。
for循环不必纯粹使用int,也不必递增或递减。这也是有效的:
for (FriendNode ii = g; ii != null; ii = ii.next)
{
System.out.println(ii);
}
然而,两者的潜在问题是,你会面临无限循环的风险——如果你将m.next设置为g,while循环和for循环都将永远执行。如果需要的话,您可以通过保留对您开始使用的FriendNode(g)的引用来防止这种情况,如果i是g,则可以脱离循环。
您可以实现Iterable并使用"其他类型"的for循环
for (Friend f : new FriendList(g)) {
System.out.println(f.name);
}
我已经创建了一个使用FriendNode
的FriendList
。并在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);
}
}
}