在java中使用for循环打印链表
我正在学习链表,并编写了一个示例代码来理解基本原理。我的代码可以工作,但是有没有其他方法可以使用for循环而不使用while循环来打印列表 我使用我创建的for循环作弊,因为我已经知道列表中的节点数。使用for循环打印列表是否有其他方法在java中使用for循环打印链表,java,linked-list,Java,Linked List,我正在学习链表,并编写了一个示例代码来理解基本原理。我的代码可以工作,但是有没有其他方法可以使用for循环而不使用while循环来打印列表 我使用我创建的for循环作弊,因为我已经知道列表中的节点数。使用for循环打印列表是否有其他方法 public class FriendNode { FriendNode next; String name; FriendNode(String name) { this.name = name; this.next = null; } p
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 (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设置在g旁边,while循环和for循环都将永远执行。如果需要,您可以通过保留对开始时使用的FriendNode g的引用,并在i为g时中断循环来防止这种情况。for循环不必完全与int一起工作,也不必递增或递减。这也是有效的:
for (FriendNode ii = g; ii != null; ii = ii.next)
{
System.out.println(ii);
}
然而,这两种方法的潜在问题是,存在无限循环的风险——如果将m设置在g旁边,while循环和for循环都将永远执行。如果需要,您可以通过保留一个对您开始使用的FriendNode g的引用来防止这种情况,如果我是g,则中断循环。您可以实现Iterable并使用其他类型的for循环
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);
}
}
}
您可以实现Iterable并使用其他类型的for循环
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);
}
}
}
为每个循环使用迭代器或。第二个循环看起来像是要抛出NullPointerException,因为它取消引用当前值,但第一个循环直到当前值为null时才会退出。为每个循环使用迭代器或。第二个循环看起来像是要抛出NullPointerException,因为它取消引用当前值,但是第一个循环将不会退出,直到当前值为null。谢谢。使用while或for有很大区别。使用while或for表示感谢有很大区别。使用while或for循环打印列表有什么区别吗。@user3497437我不这么认为,因为它是用两种不同的方式编写的相同代码。谢谢。使用while或for循环打印列表有什么区别吗?@user3497437我不这么认为,因为它是用两种不同的方式编写的相同代码。