java - 为什么我会在链表中找到额外的引用对象?

标签 java generics data-structures singly-linked-list

我一直在做练习以更好地理解链表。

我的输出是:
***显示名称 三木 无效的 阿雷克 无效的 贤士 空

<小时/>

问题:显示名称之间的空值。

尝试做:编写了一堆打印语句,看起来正在向列表中添加额外的名称引用对象。我试图找到添加方法中的错误,但从逻辑上讲,一切对我来说都很好。

我不被允许使用 LinkedList API。

感谢您的帮助。

<pre> <code>
public class NameTest {

public static void main(String[] args) {
    NameList<Name> n = new NameList<Name>();
    Name n1 = new Name(1,"Miki");
    Name n2 = new Name(2, "Arek");
    Name n3 = new Name(3, "Magi");

    n.addName(n1);
            n.addName(n2);
            n.addName(n3);
    n.displayNames();
    System.out.println("*******************\n");
     }
}

public class Name {

private int nameId;
private String firstName;   
private Name next;

public Name() { }

public Name(int nameId, String firstName) {
    super();
    this.nameId = nameId;
    this.firstName = firstName;
    this.next = new Name();
}

public int getNameId() {
    return nameId;
}

public void setNameId(int nameId) {
    this.nameId = nameId;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public Name getNext() {
    return next;
}

public void setNext(Name next) {
    this.next = next;
}   
}

public class NameList<T extends Name> {

private T head;
private int value;

public NameList() {
    head = null;
    value = 0;
}

public T getHead() {
    return head;
}

public void setHead(T head) {
    this.head = head;
}

public void addName(T name) { 
    if(head == null) {
        setHead(name);
        value++;
    }
    else {      
        T curr = getHead();
        while(curr.getNext() != null) {
            curr = (T) curr.getNext();
        }
        curr.setNext(name);
        value++;
    }
}

public void displayNames() {
    System.out.println("***DISPLAY NAMES ");
    T curr = getHead();

    while(curr.getNext() != null ) {
        System.out.println(curr.getFirstName());
        curr = (T) curr.getNext();
    }
    if(curr.getNext() == null) {
        System.out.println(curr.getFirstName());
    }
}

类名中的实例变量next应该是这样的:private Name next;很抱歉造成困惑。我在上面的代码中进行了更正。

最佳答案

你的问题是这一行。

this.next = new Name();

您将在您添加的每个 Name 的后面添加一个新的“空对象”。删除它,你就会得到想要的结果。 (我假设您在某处也有 Name extends Employee ,否则无法编译)。

关于java - 为什么我会在链表中找到额外的引用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22494295/

相关文章:

java - 我可以直接在 SCILAB 中直接使用 Java 源代码吗?或者有其他方法可以连接两者吗?

c# - C# 中泛型的默认类型。 SO 声称这是不可能的,但 EventHandler 似乎表现出这种行为?

generics - 空接口(interface)与通用接口(interface)有何不同?

c# - 对数时间 C# 列表

algorithm - 修改深度优先搜索以在特定半径内工作

java - 在 ArrayList<String> 中查找匹配的字符串出现

java - 为什么我的 Set 在 Java 编程中充当数组列表?

java - 为什么是<T extends Comparable>而不是<T Implements Comparable>?

c++ - 建立堆程序

Java - 如何检查一个类是否继承自某个类或接口(interface)?