【问题标题】:BJP5 Exercise 16.7: deleteBack — Help me understand the solutionBJP5 练习 16.7:deleteBack — 帮助我理解解决方案
【发布时间】:2019-11-14 00:26:27
【问题描述】:

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

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

接下来,我尝试创建三个新的ListNodes 等于front。虽然,我不太明白为什么需要这样做。

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

我想了解的是

  • 为什么我的原始代码(我觉得很好)不起作用。
  • 为什么我必须创建多个 ListNode 等于 front
  • 为什么我必须设置 front = null 而不是 q = null

我远不满足。有人可以帮我理解为什么这些更改是必要的吗?

【问题讨论】:

  • 前端从何而来?它看起来像一个全局/类变量,我猜将其副本 (p, q...) 更改为 null 确实与更改 front 完全不同!
  • "front; // 空列表为 null" 必须得到尊重! (我猜)
  • 那为什么当我设置 r.next = null 而不是 front = null 时它会起作用?
  • 因为在您的代码的第三种情况下,完整列表不为空,这仅在第二种情况下发生!?如果您只删除了一个元素,但它前面还有其他元素

标签: java list linked-list


【解决方案1】:

https://practiceit.cs.washington.edu/problem/view/bjp5/chapter16/e7-deleteBack
private ListNode front; // null for an empty list

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

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多