2013-02-18 88 views
1

我的CS教授要求我們使用循環鏈表開發​​自己的Java程序。我的項目是從循環列表中添加或刪除(String類型的)名稱。到目前爲止,我的添加方法完美地工作;但是,我的removeNode()方法不起作用,並且不會刪除所需的元素。它也會發生無限循環,我嘗試了很多代碼,但都沒有工作。 我remove方法如下:圓形雙鏈表無限循環

public E removeNode(E nodeToBeDeleted) 
{ 
    Node<E> nodeFound = findNode(nodeToBeDeleted); 

    if(nodeFound != null) 
    { 
     nodeFound.prev.next = nodeFound.next; 
     nodeFound.next.prev = nodeFound.prev; 
     size--; 
     return nodeFound.data; 
    } 
    return null; 
} 

基本上,findNode()中搜索其數據等於該字符串插入作爲參數的節點,但是當我調用outputList()方法,後者返回屏幕上當前節點的字符串表示形式,它將繼續無限循環。

的outputList方法是:

public void outputList() 
{ 
    Node<E> position = head; 
    do 
    { 
     System.out.print(position.data + " ==> "); 
     position = position.next; 

    } while((position != null) && (position.next != position)); 
} 

任何幫助,將不勝感激..在此先感謝。

Node類是:

static class Node<E> { 

    /** The data value. */ 
    private E data; 
    /** The link to the next node. */ 
    private Node<E> next = null; 
    /** The link to the previous node. */ 
    private Node<E> prev = null; 

    private Node(E dataItem) { 
     data = dataItem; 
    } 


    private Node(E newData, Node<E> nodeRef) 
    { 
     data = newData; 
     next = nodeRef; 
    } 

    private Node(Node<E> prevRef, E newData) 
    { 
     data = newData; 
     prev = prevRef; 
    } 

    //set next link 
    private Node(Node<E> newData, Node<E> nodeRef) 
    { 
     data = (E) newData; 
     next = nodeRef; 
    } 
} //end class Node 
+0

它是否刪除了錯誤的節點?如果是的話哪一個? – kasavbere 2013-02-18 04:02:54

+0

不,它不會刪除String參數或任何其他節點。當我調用outputList()方法時,它會進入一個無限循環並崩潰。 – jv0006 2013-02-18 04:04:25

+0

也根據geekviewpoint.com當你遍歷一個循環鏈表時,你必須打破'if(tmp.right == head){ break ; }'現在我看到www.geekviewpoint.com/java/bst/to_circular_doubly_linked_list_iterative#tabs-2 – kasavbere 2013-02-18 04:05:27

回答

4
while((position != null) && (position.next != position)) 

這確實應該:

while((position != null) && (position.next != head)) 

試想一下,如果你有一個單 - 的絕對基本情況進行遍歷。 headposition都會在您開始時指向它,並且當您想要前進時,position將再次指向與head相同的地方。這將繼續無限地

當您再次到達您的起點時,迭代必須停止。

+0

這似乎是一個很好的方法;但是,我仍然遇到同樣的問題,它會一直重複打印出相同的列表! – jv0006 2013-02-18 04:06:14

+1

@ jv0006也許創建列表的代碼是錯誤的。 – us2012 2013-02-18 04:07:44

+0

我想弄清楚什麼是錯誤的..每當我嘗試添加一個新的節點到列表中,我根本沒有任何問題 – jv0006 2013-02-18 04:12:32

0
while(position.next != head) 

我覺得檢查上面的條件對雙向鏈表是足夠的。