为什么我的删除节点功能不起作用?

时间:2018-11-10 10:53:53

标签: java nodes delete-method

我已经编写了一种方法,该方法应该删除带有seqNo“ 2”的节点,这是硬编码的。

这是主程序中的方法调用:

CircList c = new CircList();
    for (int y=0; y<5; y++)
    {
        c.appendNode(new AnyClass(y));
    }
    c.showList();
    c.deleteNode("2");
    c.showList();

这是CircList类中的方法:

public void deleteNode(String key)
{
    Node prev;
    Node tthis;
    boolean found=false;

    prev=last.next;
    tthis=last.next;
    while(prev!=last)
    {
        if(tthis.obj.getKey().equals(key))
        {
            found=true;
            break;

        }
        else
        {
            prev=tthis;
            tthis=tthis.next;
        }

        if(found==true)
        {
            if(prev==tthis)
            {
                last.next=tthis.next;

            }
            else
            {
                if(last==tthis)
                {
                    prev.next=last.next;
                    last=prev;

                }
                else
                {
                    prev.next=last.next;
                }
            }
            tthis=null;
        }
    }

}

以上代码的输出为seqNo:0 序列号:1 seqNo:2(不应输出) 序号:3 seqNo:4

我不明白为什么它不起作用。我试图改变tthis = null;但它仍然无法正常工作。

2 个答案:

答案 0 :(得分:0)

下面的代码应该可以工作。除了 if(found == true)块需要在while循环之外,我还进行了其他一些小的更改。通常与始终保持前一个指针指向前一个节点有关,即使在初始化时也是如此。

public void deleteNode(String key)
{
    Node prev;
    Node tthis;
    boolean found=false;
    boolean processedFirst = false;

    prev=last;
    tthis=last.next;
    while(prev!=last || !processedFirst) {
        if (!processedFirst) {
            processedFirst = true;
        }
        if(tthis.obj.getKey().equals(key)) {
            found=true;
            break;
        } else {
            prev=tthis;
            tthis=tthis.next;
        }
    }

    if(found==true) {
       prev.next = tthis.next;
    }
}

答案 1 :(得分:0)

我设法通过首先设置prev = last来找到解决方案;并将循环更改为do-while循环,并使if(found)条件在该循环之外。

do
    {
        if (tthis.obj.getKey().equals(key))
        {
            found = true;
        }
        else
        {
            prev = prev.next;
            tthis = tthis.next;
        }
    } while (!found && tthis != last.next);

    if (found == true)
    {
        if (prev == tthis) // The list has only one node
        {
            tthis = null;
        }
        else
        {
            if (last == tthis) // node to be deleted is the last node
            {
                last = prev;
            }

            prev.next = tthis.next;
        }
    }