使用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;
}
答案 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;
}