对于我的个人练习,我试图制作一个基本的,通用的双链表,我想知道我所做的方法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 (){
//....
}
}
答案 0 :(得分:2)
addToTail看起来不错。
使用removingDataAt()
,removingFromTail()
和removingFromHead()
,您希望使用addToTail和addToHead完成所做的工作。因为这似乎是作业的一部分,我不会给出完整的代码,只是告诉你如何去做
我看到你只有头尾的导航实例,我建议你也实现一个当前的&#39;这将允许您浏览列表以执行removingDataAt(location)
之类的操作。我不确定最有效的删除方法,但是使用Java,它会自动进行垃圾收集,因此您可以使用head = head.getNextNode()
从头部删除。从尾巴上移除是一个类似的故事
对于removingDataAt()
,您将需要一种方法来首先查找数据数据,除非使用已经知道列表的每个位置是什么。也许像find(object)
之类的东西会在失败时返回错误消息并移动当前的&#39;实例到找到的对象。您可以使用以下内容实现它:
for(current = head; current!=null; current = current.getNextNode())
请记住检查链表中是否还有其他项目。
答案 1 :(得分:1)
这是双向链表的可靠实现: 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