[英]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.