【问题标题】:RecursiveLinkedCollection and remove method javaRecursiveLinkedCollection 和删除方法 java
【发布时间】:2020-09-06 20:02:08
【问题描述】:

对于我的一项实验室作业,我必须创建一个从链表中删除节点的 recRemove 方法。这是我到目前为止所做的工作:

private LLNode<T> recRemove(LLNode<T> node, T data) {
    if(node == null) {
        return null;
    }
    if(node == data) {
        LLNode<T> temp = new LLNode<T>(data);
        node = temp;
        temp.setLink(node.getLink());
    }
    return recRemove(node.getLink(), data);
}


@Override
public boolean remove(T data) {
    recRemove(front, data);
}

我无法弄清楚如何将返回的节点从 recRemove 转换为布尔值。我从这一行得到一个错误:

  recRemove(front, data);

另外,这里是从 CollectionInterface 实现的 remove 方法:

 /**
 * Removes element if found
 * @param element
 * @return true if found and removed, otherwise false
 */ 

boolean remove(T element);

【问题讨论】:

  • 为什么要新建节点?此外,最后的描述听起来更像是“包含”功能而不是“删除”。
  • 所以它应该只是'node.setLink(node.getLink())'吗?
  • 那是我的错,我更新了描述。
  • 不应该if(node == data) 改为检查node 的值(也可能使用equals 而不是==)?此外,删除节点后,您似乎没有更新node 的前身以正确指向temp(分别更改front 的值)。目前,您的代码将删除所有出现的值(如果有多个值),如果打算将其添加到您的 remove 方法的 javadoc 中会很好。
  • 这能回答你的问题吗? Remove node from linked list recursively

标签: java


【解决方案1】:

使用递归,从最简单的情况开始通常会有所帮助。通常列表的递归定义是head :: tail,即列表的第一个元素,然后是列表的其余部分。方便的是,链表几乎可以这样建模(node 是头部,getNext() 指向尾部)。

我们的递归删除函数将始终返回新列表的头部。

所以从列表中删除元素的最简单情况是从空列表中删除:

if (node == EMPTY) return EMPTY;

EMPTY是列表末尾的常量标签,可以用Java中的null建模)

第二种最简单的情况是头部已经是需要移除的元素:

if (Objects.equals(node.value(), data)) {
    return node.next();
}

这就留下了要删除的节点可能存在于尾部的情况:

return new Node(node.value(), recRemove(node.next(), data));

把它们放在一起:

Node<T> recRemove(Node<T> node, T value) {
    if (node == EMPTY) return EMPTY;
    if (Objects.equals(node.value(), data)) return node.next();
    return new Node<T>(node.value(), recRemove(node.next(), data));
}

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多