在java中使用for循环打印链表



我正在学习链表,并编写了一个示例代码来理解基本原理。我的代码是有效的,但是有没有其他方法可以使用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);
    }

我已经创建了一个使用FriendNodeFriendList。并在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);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新