0

我创建了两个类,即 Node 和 LinkedList。该代码是可编译的,但它永远不会生成我存储在链接列表中的最后一个数据。

考虑这两个类

节点.java

public class Node {

private int id;
private String name;
private Node next;

public Node(int id, String name) {
    this.id = id;
    this.name = name;
}

public int getID() {
    return id;
}

public String getName() {
    return name;
}

public void setID(int id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

public Node getNext() {
    return next;
}

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

public Node(int id, String name, Node next) {
    this.id = id;
    this.name = name;
    this.next = next;
}

}

链表.java

public class LinkedList {

private Node start;

public LinkedList() {
    start = null;
}

public static void main(String[] args) {
    LinkedList list = new LinkedList();

    list.create(2345,"Peter");
    list.create(3001,"Mary");
    list.create(4763,"John");
    list.create(3863,"Johnny");

    list.display();
}

public void create(int id, String name) {
    if(start == null) {
    start = new Node(id, name, start);
    } 
    else {  
        Node temp = start;

    while(temp.getNext() != null) {
        temp = temp.getNext();
    }
        Node newNode = new Node(id, name, null);
        temp.setNext(newNode);
    }
}


public void display() {
    if(start == null) {
        System.out.println("\nThe list is empty!");
    } 
    else {
        Node temp = start;

    while(temp.getNext() != null) {
        System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
        temp = temp.getNext();
    }
    }
}

public void delete(int id, String name) {
    Node previous =  start;
    Node temp = start;

    while(temp.getID() != id) {
        if(temp.getNext() == null) {
            System.out.println("\nElement "+ id + " not found !");
        break;
    }

    while(temp.getName() != name) {
        if(temp.getNext() == null) {
            System.out.println("\nElement "+ name + " not found !");
        break;
    }

        previous = temp;
        temp = temp.getNext();

    }
    if(temp == start) {
        start = start.getNext();
    } 
    else {
        previous.setNext(temp.getNext());
    }
    }
}
}

在这种情况下,程序将生成存储在列表中的所有内容,但不会生成最后一个。

换句话说,程序不显示以下行,而存储的前三个数据可以毫无问题地输出。

list.create(3863,"约翰尼");

我可以知道我的代码有什么问题吗?提前致谢!=)

4

5 回答 5

2

您无需temp.getNext()display(). 您可以使用:

public void display() {
    if(start == null) {
        System.out.println("\nThe list is empty!");
    } 
    else {
        Node temp = start;

        while(temp != null) {
            System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
            temp = temp.getNext();
        }
    }
}

当您调用temp.getNext()检查是否应该停止循环时,您会错过最后一个元素。

于 2013-11-07T11:45:21.853 回答
1

在您的显示代码中,您在打印最后一个元素之前停止:

else {
    Node temp = start;

    while(temp.getNext() != null) {
        System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
        temp = temp.getNext();
    }
}

这行,while(temp.getNext() != null)意味着如果is则while循环不会执行,但最后一个元素是因为它位于列表的末尾。您需要添加以下行:temp.getNext()nullgetNext()null

System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());

在while循环之后打印最后一个元素。

您还在temp.getNext()该循环中执行了两次;如果将结果存储在局部变量中,则不必两次调用该方法。

于 2013-11-07T11:43:26.587 回答
1

问题出在你的while循环上,试试这个

while(true) {

    System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
    temp = temp.getNext();
    if(temp==null) break;

}
于 2013-11-07T11:45:07.157 回答
0
   while(temp.getNext() != null) {
    System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
    temp = temp.getNext();
}

这意味着在您的最后一个节点上,下一个节点将为空,因此最后一个节点不会显示。

因此,您只需在 while 循环之后添加打印行,如下所示:

       while(temp.getNext() != null) {
    System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
    temp = temp.getNext();
}
("ID : " + temp.getID() +  " Name : " + temp.getName());
于 2013-11-07T11:42:54.110 回答
0

我会用这个:

while(temp.hasNext()) {
    ...
}

然后您也将使用最后一个元素进入循环。你正在失去元素做两次getNetxt()

于 2013-11-07T11:44:55.637 回答