java - BJP5练习16.7 : deleteBack — Help me understand the solution

标签 java list linked-list

我一直在做这个练习来练习ListNode,并且非常沮丧,因为尽管我认为我写的代码是正确的(如下所示),但它没有让我通过。

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。进行此更改后,所有测试均通过。

我想要理解的是

  • 为什么我的原始代码(对我来说似乎很好)不起作用。
  • 为什么我必须创建多个等于 frontListNode
  • 为什么我必须设置 front = null 而不是 q = null

我还远远没有满意。有人可以帮助我理解为什么需要进行这些更改吗?

最佳答案

https://practiceit.cs.washington.edu/problem/view/bjp5/chapter16/e7-deleteBack
要求 private ListNode 前面;//null 表示空列表

在第一种情况下, front 已经为空(与其副本 p 一样)。
在第二种情况下,您删除列表中最后一个也是唯一一个值,因此 front 必须变为 null,因为列表现在为空。将本地副本 q 设置为 null 并不能解决这个问题。
在第三种情况下,列表中有超过 1 个元素,因此删除最后一个元素后列表不为空,并且 front 必须保持其非空值。

关于java - BJP5练习16.7 : deleteBack — Help me understand the solution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847642/

相关文章:

java - 如何使用 Maven 创建具有依赖项的可执行/可运行 JAR?

python - 我需要创建一个列表,其中包含一次取三个列表的所有总和,即添加前 3 个元素,然后添加下 3 个

Haskell 计数列表类型

java - 使用java创建一个没有数字重复的4位随机数

java - 使用 Groovy 修改节点标签的 Jenkins/Hudson CLI API

java - LString类,使用链表来制作字符串,java

c - 收到 SIGSEGV 错误。找不到负责的指针

带有列表和追加的 Python 奇怪行为

C++删除成员函数中的临时节点?

尝试释放链接列表的元素时出现 CrtIsValidHeapPointer 错误