我一直在做这个练习来练习ListNode
s,我非常沮丧,因为尽管我认为我写的代码是正确的(如下所示(,但它并没有让我通过。
public int deleteBack()
{
ListNode p = front;
if(p == null)
{
throw new NoSuchElementException();
}
if(p.next == null)
{
int data = p.data;
p = null;
return data;
}
while(p.next.next != null)
{
p = p.next;
}
int data = p.next.data;
p.next = null;
return data;
}
接下来,我尝试总共创建三个等于front
的新ListNode
。尽管如此,我不太明白为什么这是必要的。
public int deleteBack()
{
ListNode p = front;
if(p == null)
{
throw new NoSuchElementException();
}
ListNode q = front;
if(q.next == null)
{
int data = q.data;
q = null;
return data;
}
ListNode r = front;
while(r.next.next != null)
{
r = r.next;
}
int data = r.next.data;
r.next = null;
return data;
}
不幸的是,这也给了我和以前一样的结果(只通过了三次测试(,直到我将q = null
更改为front = null
。在这次更改之后,所有测试都通过了。
我想了解的是
- 为什么我的原始代码——对我来说似乎很好——不能工作
- 为什么我必须创建多个等于
front
的ListNode
- 为什么我必须设置
front = null
而不是q = null
我一点也不满意。有人能帮我理解为什么这些改变是必要的吗?
https://practiceit.cs.washington.edu/problem/view/bjp5/chapter16/e7-deleteBack
询问private ListNode front; // null for an empty list
在第一种情况下,front已经为null(就像它的副本p一样(
在第二种情况下,您删除了列表中最后一个也是唯一一个值,因此front必须变为null,因为列表现在为空。将本地副本q设置为null并不能解决这个问题
在第三种情况下,列表中有一个以上的元素,因此删除最后一个元素后,列表不为空,front必须保持其非空值。