有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java通用双链表

就我个人的实践而言,我正在尝试创建一个基本的、通用的双链接列表,我想知道我创建的addtoHead()和addtoTail()方法是否正确有效,如果不正确,还有什么更好的方法?我如何才能从removingDataAt()、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 (){
    //....
}
}

共 (2) 个答案

  1. # 1 楼答案

    addToTail在我看来不错

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

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

  2. # 2 楼答案

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

    Add方法如下所示:

       // 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