weixin_42510455 2014-08-09 22:03
浏览 236
已采纳

Java写的一个双向链表模板,出了点问题,应用不了自己写的内部类,却能应用String类

[code="java"]package com.read.List;

public class DbLinkedList {
//定义内部类,用作链表的节点

private class Node

{

Node pre; //指向前一个节点

Node next; //指向后一个节点

T value; //当前节点的值

    public Node(T value, Node<T> next, Node<T> pre)  
    {  
        this.value = value;  
        this.next = next;  
        this.pre = pre;  
    }  

    public String toString()  
    {  
        return this.value + "";  
    }  
}  

public Node<T> header;  //定义头节点  
public int size;  //定义链表的长度 
public int flag;  //指针所在位置

public DbLinkedList()  
{  
    this.header = new Node<T>(null, null, null);//空的头节点,用来区分双向循环链表的首尾
    this.flag = 0;
    this.size = 0;
}  

public void add(T value)//在链表的尾巴上面加一个节点
{
    Node<T> temp=entry(size);
    temp.value=value;
    Node<T> next=new Node<T>(null, null, null);
    next.pre=temp;
    temp.next=next;
    this.flag++;
    this.size=this.flag;

}

public T get(int index)  
{  
    return entry(index-1).value;  
}  

private Node<T> entry(int index) //迭代至index处的节点  
{            
    Node<T> node = this.header;  
    for(int i=1; i<=index; i++)  
    {           
        node = node.next;  
    }  

    return node;  
}  

public void clear()  
{  
    this.header = new Node<T>(null, null, null);
    this.size = 0;
    this.flag = 0;
}

//标志从当前位置前移一位,表示此时后进了一步
public boolean flagpre()
{
    if(flag==0) //标志在第一步,不能再后退了
    {
        return false;
    }           
    flag--;
    return true;
}

//标志从当前位置前后一位,表示此时前进了一步
public boolean flagnext()
{
    if(flag==size) //标志在最后一步,不能再后退了
    {
        return false;
    }           
    flag++;
    return true;
}

//在第一步时返回true
public boolean firststep()
{
    if(flag==0)
    {
        return true;
    }
    return false;
}

 //在最后一步时返回true
public boolean endstep()
{
    if(flag==size)
    {
        return true;
    }
    return false;
}

public boolean isEmpty()  
{  
    return this.size == 0;  
}  

public int size()  
{  
    return this.size;  
}  

}

package com.read.List;

public class god {
public static class select{
String name;
String x;
String y;
select(){

    }
    public void clear(){
        name=null;
        x=null;
        y=null;
    }

}
public static void main(String[] args){
    DbLinkedList<select> List=new DbLinkedList<select>();
    select temp=new select();
    for(int i=0;i<5;i++)
    {
        temp.clear();
        temp.name="No."+i;
        temp.x="x="+i;
        temp.y="y="+i;
        List.add(temp);
    }
    temp=List.get(List.flag);
    System.out.println(temp.name);
    System.out.println(temp.x);
    System.out.println(temp.y);
    temp.clear();
    System.out.println(List.flag);
    List.flagpre();
    System.out.println(List.flag);
    temp=List.get(List.flag);
    System.out.println(temp.name);
    System.out.println(temp.x);
    System.out.println(temp.y);

    DbLinkedList<String> it=new DbLinkedList<String>();
    it.add("0");
    it.add("1");
    it.add("2");
    it.add("3");
    it.add("4");
    System.out.println(it.get(it.flag));
    it.flagpre();
    System.out.println(it.get(it.flag));



}

}[/code]

控制台结果:
No.4
x=4
y=4
5
4
null
null
null
4
3
其中,temp第二次赋值失败了(3个null),it成功了(3)
ps:本人是新来的,积分少,见谅!

  • 写回答

1条回答 默认 最新

  • winion_c 2014-08-09 23:13
    关注

    select temp=new select();

    for(int i=0;i<5;i++)

    {

    temp.clear();

    temp.name="No."+i;

    temp.x="x="+i;

    temp.y="y="+i;

    List.add(temp);

    }

    只创建了一个select对象,然后又
    temp.clear();

    输出当然是null了。
    不是第二次赋值失败,而是所有的引用都指向了一个对象。Java里面的对象=赋值类似与C++中的引用,不会创建新的对象的。所有select尽管循环了五次,只有一个而已。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法