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

时间:2014-03-19 01:09:50

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

我一直在努力练习以更好地理解Linked List。

我的输出是:
*** DISPALY NAMES 三木 空值 Arek 空值 贤士 空


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

试图这样做:写了一堆打印语句,它看起来像是在列表中添加额外的Name引用对象。我试图在add方法中找到错误,但逻辑上一切都对我很有用。

我不允许使用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());
    }
}

类名中的实例变量应该是这样的:private name next;我很抱歉混淆。我在上面的代码中进行了修正。

1 个答案:

答案 0 :(得分:2)

你的问题就在这一行。

this.next = new Name();

您在添加的每个Name的背面添加了一个新的“空对象”。删除它,你会得到所需的结果。 (我假设你在那里也有Name extends Employee,否则这不会编译。)