链接列表,通过返回新列表删除元素

时间:2017-02-18 02:54:01

标签: java linked-list iterator

使用Java,我有一个链接的LList类和一个LLNode类。我试图通过返回没有元素的新链接列表从链接列表中删除元素。基本上,如果列表不包含特定元素,则返回它,但如果它确实创建了一个新元素。我遍历当前列表以查看它是否包含元素e,并不完全确定如何创建没有该特定元素的列表。

public LList<T> remove(T t) {
   if (this.contains(t)) {
      LList<T> newList = new LLSet<>(this.head);
        newList.head = new LLNode<>(, this.head);

        return newList;
      }

        return this;
      }

3 个答案:

答案 0 :(得分:0)

我假设LList和LLNodes是你自己的类。 我的第一个问题是,如果您可以从同一列表中删除元素并返回它,为什么要返回新列表?你应该做的是, 由于链表有节点链接,可能你应该  1.逐个遍历列表  2.并删除方法中传递的元素。

但如果你真的希望通过返回新列表来实现这一点。以下是你需要做的,  1.创建一个新列表  2.迭代旧列表并使用旧列表中的元素填充新列表  3.在循环中跳过要删除的元素

我的建议是,不要创建新列表,但要修改现有列表。这就是使用LinkedList的好处。

答案 1 :(得分:0)

您必须使用新节点构建新列表。如果您尝试共享节点,则将对两个列表进行更改。

我认为可以使用简单的while循环来创建新列表:

public LList<T> remove(T t) {
    LList<T> newList = new LList<>();
    LLNode<T> current = this.head;
    while (current != null) {
        if (!current.element.equals(t)) {
            newList.add(t)
        }
    }
    return newList;
}

如果这实际上是您想要的功能,并且您可以自由更改方法名称,我建议您调用它without(T t)。大多数人都希望remove(T t)修改它所调用的列表。

答案 2 :(得分:0)

假设您的remove方法在LList类中。试试这个:

public LList<T> remove(T t) {

   LLNode curr = this.head;
   LLNode prev = null;

   while(curr != null) {

        if (curr.equals(T)) {
           prev.setNext(curr.next());
           return this.head;
        }

        prev = curr;
        curr = curr.next();
   }

   return this.head;
}