【问题标题】:Generic Doubly Linked List通用双向链表
【发布时间】:2015-06-19 04:45:52
【问题描述】:

对于我的个人实践,我正在尝试制作一个基本的、通用的双向链表,我想知道我制作的方法 addtoHead() 和 addtoTail() 是否正确且有效,如果不是什么会更好?以及如何从方法列表中删除 removeDataAt()、removingFromTail()、removingFromHead()?

节点类:

public class PracticeNode<T> {

private T data;
private PracticeNode<T> next;
private PracticeNode<T> prev;

PracticeNode() {
    next = null;
    prev = null;
    data = null;
}

PratciceNode(T data) {

this(data, null, null);

}

PracticeNode(T data, PracticeNode<T> next, PracticeNode<T> prev) {
    this.data = data;
    this.next = next;
    this.prev = prev;
}

public void setNextNode(PracticeNode<T> next) {
    this.next = next;
}

public void setPrevNode(PracticeNode<T> prev) {
    this.prev = prev;
}

public void setData(T data) {
    this.data = data;
}

public PracticeNode<T> getNextNode() {
    return next;
}
public PracticeNode<T> getPrevNode() {
    return prev;
}

public T getData() {
    return data;
}

}

链表类:

public class PracticeLinkedList<T> {

private PracticeNode<T> head;
private PracticeNode<T> tail;

public void addtoHead(T data ) {
    PracticeNode<T> newnode=new PracticeNode<T>();
    if(head==null){
        head=newnode;
        tail=newnode;
        newnode.setNextNode(null);
        newnode.setPrevNode(null);
    }else{
         newnode.setNextNode(head);
         head.setPrevNode(newnode);
         head=newnode;
    }

}

public void addToTail(T data) {
    PracticeNode<T> newnode=new PracticeNode<T>();
     if(tail==null){
            head=newnode;
            tail=newnode;
            newnode.setNextNode(null);
            newnode.setPrevNode(null);
        }else{
            newnode.setPrevNode(tail);
            tail.setNextNode(newnode);
            tail=newnode;
        }


}

public T removingDataAt (int){
    //....
}

public T removingFromTail (){
    //....
}

public T removingFromHead (){
    //....
}
}

【问题讨论】:

  • 你不需要尾节点。
  • addToTail()addToHead() 在我看来是正确的。您可以通过注意在构造函数中初始化 headprev 来提高它们的效率,因此无需在这些方法中将它们设置为 null

标签: java algorithm generics linked-list


【解决方案1】:

addToTail 对我来说看起来不错。

对于removingDataAt()removingFromTail()removingFromHead(),您想要执行您对 addToTail 和 addToHead 所做的操作。因为这看起来像是作业中的东西,所以我不会给出完整的代码,而只是告诉你怎么做。
我看到您只有 head 和 tail 的导航实例,我建议您还实现一个“当前”,它允许您在列表中导航以执行诸如 removingDataAt(location) 之类的操作。我不确定删除东西的最有效方法,但使用 Java,它会自动进行垃圾收集,因此您可以使用 head = head.getNextNode() 简单地从头部删除。从尾部移除是一个类似的故事。
对于removingDataAt(),您将需要一种方法来首先查找数据数据,除非用户已经知道列表中每个位置的内容。也许像find(object) 这样的东西会在失败时返回错误消息,否则会将“当前”实例移动到找到的对象。您可以使用以下代码来实现它:
for(current = head; current!=null; current = current.getNextNode())

记得检查链表中是否还有其他项目。

【讨论】:

  • 不,这是我的 java 认证个人实践,因此感谢任何代码和帮助。
【解决方案2】:

这是一个可靠的双向链表实现: http://algs4.cs.princeton.edu/13stacks/DoublyLinkedList.java.html

添加方法如下所示:

   // add element to list 
    public void add(Item item) {
        Node x = current.prev;
        Node y = new Node();
        Node z = current;
        y.item = item;
        x.next = y;
        y.next = z;
        z.prev = y;
        y.prev = x;
        N++;
        index++;
        lastAccessed = null;
    }

注意事项:

a> <b> <c> <e> <f> <g

如果你想添加d,那么找到e并添加d

    public void add(Item item) {
        Node x = current.prev; //new before element : c
        Node y = new Node();   //new node to store element
        Node z = current;      //new after element : e
        y.item = item;         //store value to the node : d.value=value
        x.next = y;            //link before element next : c>
        y.next = z;            //link element next  : d>
        z.prev = y;            //link after element previous : <e
        y.prev = x;            //link after element previous : <d
        N++;                   //increase number of elements on list counter
        index++;               //increase current position number 
        lastAccessed = null;
    }

现在你应该有:

a> <b> <c> <d> <e> <f> <g

【讨论】:

  • 使用链表的全部原因是在元素之间插入元素比在数组上要快得多。您使用 x2 通用列表,在幕后使用数组,因此您编写的内容没有任何价值。作为一名教师,我不会接受这是一个解决方案。
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 2013-11-15
  • 2019-06-03
  • 2015-03-24
  • 2015-04-04
相关资源
最近更新 更多