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 (){
//....
}
}
# 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 楼答案
下面是双链表的一个可靠实现: http://algs4.cs.princeton.edu/13stacks/DoublyLinkedList.java.html
Add方法如下所示:
这里需要注意的是:
如果要添加
d
,请查找e
并添加d
现在你应该: