我已经编写了一种方法,该方法应该删除带有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;但它仍然无法正常工作。
答案 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;
}
}