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