簡體   English   中英

通用雙鏈表

[英]Generic Doubly Linked List

對於我的個人實踐,我試圖建立一個基本的,通用的雙鏈表,我想知道我所做的方法addtoHead()和addtoTail()是否正確和有效,如果不是更好? 以及如何從列表中刪除removeDataAt()方法,removeFromTail(),removeFromHead()?

節點類:

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對我來說很好看。

隨着removingDataAt() removingFromTail()removingFromHead()你想要做您與addToTail和addToHead做了什么。 因為這似乎是來自作業的東西,我不會給出完整的代碼,而只是告訴你如何去做。
我看到你只有頭部和尾部的導航實例,我建議你也實現一個“當前”,它允許你在List中導航來做一些事情,比如removingDataAt(location) 我不確定最有效的刪除方法,但是使用Java,它會自動進行垃圾收集,因此您只需使用head = head.getNextNode()從頭部刪除即可。 從尾巴中刪除是一個類似的故事。
對於removingDataAt()您將需要一種方法來首先查找數據數據,除非用戶已經知道列表的每個位置是什么。 也許像find(object)這樣會在失敗時返回錯誤消息並將'current'實例移動到找到的對象。 你可以通過使用這樣的東西來實現它:
for(current = head; current!=null; current = current.getNextNode())

請記住檢查鏈表中是否還有其他項目。

以下是雙向鏈表的可靠實現: 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM