1

我的 CS 教授要求我们使用循环链表开发​​自己的 Java 程序。我的项目是从循环列表中添加或删除名称(字符串类型)。到目前为止,我的 add 方法运行良好;但是,我的 removeNode() 方法不起作用并且不会删除所需的元素。它也进行了无限循环,我尝试了很多代码,但它们都不起作用。我的删除方法如下:

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));
}

任何帮助将不胜感激..提前致谢。

节点类是:

    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
4

2 回答 2

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

这应该是:

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

想象一下,如果你有一个单例 - 遍历的绝对基本情况。 head并且position在你开始时都会指向它,当你想前进时,会再次position指向同一个地方。head这将无限期地继续下去

当您再次到达起点时,迭代必须停止。

于 2013-02-18T04:03:12.570 回答
0
while(position.next != head)

我认为检查上述条件对于双循环 LinkedList 来说已经足够了。

于 2013-02-18T04:06:44.530 回答