Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一般双链表_Java_Algorithm_Generics_Linked List - Fatal编程技术网

Java 一般双链表

Java 一般双链表,java,algorithm,generics,linked-list,Java,Algorithm,Generics,Linked List,就我个人的实践而言,我正在尝试创建一个基本的、通用的双链接列表,我想知道我创建的addtoHead()和addtoTail()方法是否正确有效,如果不正确,还有什么更好的方法?我如何才能从removingDataAt()、removingFromTail()和removingFromHead()方法的列表中删除这些方法 节点类: public class PracticeNode<T> { private T data; private PracticeNode<T>

就我个人的实践而言,我正在尝试创建一个基本的、通用的双链接列表,我想知道我创建的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;
}

}
公共课堂实践模式{
私有T数据;
下一步是私人执业;
私人执业前;
实践模式(){
next=null;
prev=null;
数据=空;
}
PratciceNode(T数据){
这(数据,空,空);
}
PracticeNode(T数据,PracticeNode下一个,PracticeNode上一个){
这个数据=数据;
this.next=next;
this.prev=prev;
}
public void setNextNode(PracticeNode next){
this.next=next;
}
公共无效设置PrevNode(PracticeNode prev){
this.prev=prev;
}
公共无效设置数据(T数据){
这个数据=数据;
}
公共实践模式getNextNode(){
下一步返回;
}
公共实践模式getPrevNode(){
返回上一个;
}
公共T getData(){
返回数据;
}
}
链表类别:

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 (){
    //....
}
}
公共课堂实践链接列表{
私人执业经理;
私人执业律师;
公共无效添加头(T数据){
PracticeNode newnode=新PracticeNode();
if(head==null){
头=新节点;
tail=newnode;
newnode.setNextNode(null);
newnode.setPrevNode(空);
}否则{
newnode.setNextNode(head);
head.setPrevNode(newnode);
头=新节点;
}
}
公共无效地址(T数据){
PracticeNode newnode=新PracticeNode();
if(tail==null){
头=新节点;
tail=newnode;
newnode.setNextNode(null);
newnode.setPrevNode(空);
}否则{
newnode.setPrevNode(tail);
tail.setNextNode(newnode);
tail=newnode;
}
}
公共T删除数据地址(int){
//....
}
公共T从尾部移除(){
//....
}
公共T从头部移除(){
//....
}
}

addToTail在我看来很不错

使用
removingDataAt()
removingFromTail()
,以及
removingFromHead()
,您需要完成addToTail和addToHead的操作。因为这看起来像是作业中的内容,所以我不会给出完整的代码,而是告诉您如何操作。
我看到您只有head和tail的导航实例,我建议您也实现一个“current”,它将允许您在列表中导航,以执行诸如
removingDataAt(location)
之类的操作。我不确定删除东西的最有效方法是什么,但在Java中,它会自动执行垃圾收集,因此您只需使用
head=head.getNextNode()
从头部删除即可。从尾部移除也是一个类似的故事。
对于
removingDataAt()
,您需要先找到数据的方法,除非用户已经知道列表中的每个位置。可能类似于
find(object)
的操作会在失败时返回错误消息,否则会将“current”实例移动到找到的对象。您可以使用如下方式实现它:
for(current=head;current!=null;current=current.getNextNode())


记住检查链表中是否还有其他项目

下面是双链表的一个可靠实现:

Add方法如下所示:

   // 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
现在你应该有:

a> <b> <c> <d> <e> <f> <g

a>您不需要尾部节点。
addToTail()
addToHead()
在我看来是正确的。您可以通过在构造函数中初始化
head
prev
来提高它们的效率,这样在这些方法中就不需要将它们设置为
null
。你使用x2通用列表,幕后使用数组,因此你写的东西没有价值。作为一名教师,我不会接受这个解决方案。不,这是我的java认证的个人实践,所以任何代码和帮助都是非常感谢的。
a> <b> <c> <d> <e> <f> <g