2011-10-25 160 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; 
}