2017-02-18 102 views
0

使用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

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

但是,如果你真的希望通过返回新列表来实现这一点。下面是你必须做什么, 1. 2.遍历旧的列表中创建一个新的列表,并填写与旧名单 3.元素的新list跳过要在循环要删除的元素

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

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

如果这种情况真的是你想要的功能,你有自由更改方法的名称,我会建议打电话它​​。大多数人会希望remove(T t)修改它被调用的列表。

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