2011-10-25 107 views
2

我有一个问题,添加元素在liked表插入双向链表

public class LinkedList { 
    public Node first; 
    public Node last; 

    public LinkedList() { 
     first = null; 
     last = null; 
    } 

    public void addFirst(Student student) { 
     Node f = first; 
     Node newNode = new Node(student); 
     first = newNode; 
     if (f == null) last = newNode; 
     else f.previous = newNode; 
    } 

    public void addLast(Student student) { 
     Node l = last; 
     Node newNode = new Node(student); 
     last = newNode; 
     if (l == null) first = newNode; 
     else { 
      l.next = newNode; 
     } 
    } 


    public void display() { 
     Node current = first; 
     while (current != null) { 
      //print... 
      current = current.next; 
     } 
    } 

我的问题是,当我运行:

list.addLast(1); 
list.addFirst(2); 
list.display(); 

它显示只是“2”“显示”方法只是看不到最后添加的元素。
但是,如果我运行:

list.addFirst(2); 
list.addLast(1); 

这将同时显示。 它有什么问题? 谢谢。

回答

2

在addFirst中,你也必须把newNode.next = f,现在你只是更新双向关系的一方。而且由于显示屏使用了下一个字段,因此它不会像您期望的那样工作。

同样,在addLast中,您需要添加newNode.previous = l,但由于前面的字段没有用于显示方法,所以在执行它时不会出现错误。

4

如果这个列表是双向链接的,你不应该在newNode中添加一个引用到它之前/之后的元素吗?

你的显示器()方法遍历node.nextaddFirst()你从来没有设置.next - 因此,如果调用addFirst()几次,只有这种方法,会出现什么display()打印?

+0

我明白了,它会打印最后一个添加的元素。 – Nikita

0
public void addFirst(Student student) { 
    Node f = first; 
    Node newNode = new Node(student); 
    newNode.next = f; // this was missing 
    first = newNode; 
    if (f == null) 
     last = newNode; 
    else 
     f.previous = newNode; 
} 

public void addLast(Student student) { 
    Node l = last; 
    Node newNode = new Node(student); 
    newNode.previous = l; // this was missing 
    last = newNode; 
    if (l == null) 
     first = newNode; 
    else 
     l.next = newNode; 
}