2016-07-03 43 views
2

我開始學習Java。作爲一個分配,我必須使用包含在代碼中的給定接口來實現一個雙向鏈表。 我的方法insertAtTheEnd()似乎無法正常工作,因爲在插入幾個元素後,元素上的值爲null。 我檢查了關於該主題的類似問題,並嘗試將解答應用於我的問題,但無法再進一步瞭解。所以任何幫助表示讚賞我如何設置此方法使其工作。 謝謝!如何在Java中的雙向鏈表中追加節點?

public interface IValueElement 
{ 
    public String getName(); 
    public void setName(String paramName); 
    public int getValue(); 
    public void setValue(int paramValue); 
} 

public interface IListElement 
{ 
    public IValueElement getValueElement(); 
    public void setValueElement(IValueElement value); 
    public IListElement getPredecessor(); 
    public void setPredecessor(IListElement predecessor); 
    public IListElement getSuccessor(); 
    public void setSuccessor(IListElement successor); 
} 

public interface IList 
{ 
    public IListElement getHead(); 
    public void insertAtTheEnd(IValueElement value); 
//... 
} 

public class List implements IList 
{ 
    public List() 
    { 
     if (head == null) 
     { 
      head = new ListElement(null); 
     } 
     else 
     { 
      return; 
     } 
    } 

    private IListElement head; 

    public IListElement getHead() 
    { 
     return head; 
    } 

    public void insertAtTheEnd(IValueElement value) 
    { 
     if (head.getSuccessor() != null) 
     { 
      IListElement l = head; 
      while (l.getSuccessor() != null) 
       l = l.getSuccessor(); 
      IListElement q = new ListElement(value); 
      l.setPredecessor(q); 
     } 
     else 
     { 
      IListElement q = new ListElement(value); 
      q.setPredecessor(head); 
      q.setSuccessor(null); 
      head.setSuccessor(q); 
      head.setPredecessor(q); 
     } 
    } 
} 

另外這裏有我ValueElement和ListElement的實現:

//ListElement.java 

public class ListElement implements IListElement 
{ 
    public ListElement(IValueElement value) 
    { 
     this.valueElement = checkValueElementAttribute(value); 
    } 

    private IValueElement checkValueElementAttribute(IValueElement value) 
    { 
     return (value == null) ? new ValueElement(null, 0) : value; 
    } 

    private IValueElement valueElement; 

    public IValueElement getValueElement() 
    { 
     return this.valueElement; 
    } 

    public void setValueElement(IValueElement value) 
    { 
     if (value != null) 
     { 
      this.valueElement = value; 
     } 
    } 

    private IListElement predecessor; 

    public IListElement getPredecessor() 
    { 
     return this.predecessor; 
    } 

    public void setPredecessor(IListElement predecessor) 
    { 
     this.predecessor = predecessor; 
    } 

    private IListElement successor; 

    public IListElement getSuccessor() 
    { 
     return this.successor; 
    } 

    public void setSuccessor(IListElement successor) 
    { 
     this.successor = successor; 
    } 
} 


// ValueElement.java 
public class ValueElement implements IValueElement 
{ 
    private String name; 

    public String getName() 
    { 
     return this.name; 
    } 

    public void setName(String paramName) 
    { 
     if (paramName != null) 
     { 
      this.name = paramName; 
     } 
    } 

    public ValueElement(String name, int value) 
    { 
     if (name == null || name.equals("")) 
     { 
      name = "default"; 
     } 
     else 
     { 
      this.name = name; 
     } 
     this.value = value; 
    } 

    private int value; 

    public int getValue() 
    { 
     return this.value; 
    } 

    public void setValue(int paramValue) 
    { 
     if (paramValue != 0) 
     { 
      this.value = paramValue; 
     } 
    } 

    public String toString() 
    { 
     return "Name: " + this.name + " - Value: " + this.value; 
    } 

} 
+0

爲什麼構造包含這些行,他們是因爲完全沒有必要一個新的y構造對象始終將'head'設置爲null。你可以完全移除構造函數並初始化你聲明它的'head'。 – Kayaman

+0

看看你的「if」塊。與else塊不同,它不設置任何東西的繼承者。所以缺少一些東西。而且,q是新的末端節點,所以它應該是'l'的繼承者,而不是它的前身。好的變量命名會幫助你。 –

+0

@Kayaman:你說得對,謝謝你的提示。頭部不應該是空的,這是一個錯誤。 – mark

回答

0

請提供完整的代碼,以便我們可以運行並幫助你們的,現在我們只能想到這些問題:

1)你可能沒有所謂的那些節點 2 setValueElement)您else塊同時包含前任和繼任者相同元素的設置,以便它的代碼一定錯線

不應該這是你的代碼

public void insertAtTheEnd(IValueElement value) 
    { 
     if (head.getSuccessor() != null) 
     { 
      IListElement l = head; 
      while (l.getSuccessor() != null) 
       l = l.getSuccessor(); 
      IListElement q = new ListElement(value); 
      l.setSuccessor(q); 
     }  

    else 
     { 
      IListElement q = new ListElement(value); 
      q.setPredecessor(head); 
      q.setSuccessor(null); 
      head.setSuccessor(q); 
     } 
    } 
+0

這應該是評論 – AADProgramming

+0

謝謝,我會檢查那一行。我只包含了所需的代碼(請參閱前面的答案)。 – mark

+0

@AADTechnical我的聲譽不允許我發表評論 –

0

有IValueElement和IListElement的實現提供了你,或者他們的東西,你還必須實現?從你提供的代碼中我看不到它們的實現。

關於你的方法insertAtTheEnd,它看起來像你主要是正確的想法,但也許你可以改善它。

在if塊的末尾,您將l的前任設置爲q。我認爲這可能是錯誤的方式。 l在那一點上是列表中的最後一個元素,沿着後繼鏈走到沒有更多的時候,我認爲新元素(q)現在應該被添加爲不是前任的繼任者。 另外,我認爲q需要將它的前任設置爲l。

在你的else塊中,你正確地設置了q的前身和後繼,並正確設置了頭的後繼,但是,爲什麼要將頭的前任設置爲q?這將使q既是繼任者又是前任。我想你應該刪除最後一次setPredecessor調用。

+0

感謝您的回答,我會檢查並嘗試改進它。由於我是Java新手,這可能需要一些時間。我只包含了我的IValueElement和IListElement的實現。 – mark