什么';我关于Java中链表的代码有什么问题?

什么';我关于Java中链表的代码有什么问题?,java,linked-list,Java,Linked List,我创建了两个类,即Node和LinkedList。代码是可编译的,但它从不生成我存储在链接列表中的最后一个数据 以这两类为例 Node.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() {

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

以这两类为例

Node.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;
}

}
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());
    }
    }
}
}
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;
}

}
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());
    }
    }
}
}
在这种情况下,程序将生成列表中存储的所有内容,但不会生成最后一个内容

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

创建(3863,“约翰尼”)

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

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

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

       while(temp.getNext() != null) {
    System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
    temp = temp.getNext();
}
("ID : " + temp.getID() +  " Name : " + temp.getName());
这意味着在最后一个节点上,下一个节点将为null,因此最后一个节点不会显示

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

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

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

else {
    Node temp = start;

    while(temp.getNext() != null) {
        System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
        temp = temp.getNext();
    }
}
while(temp.getNext()!=null)
表示如果
temp.getNext()
null
,则
while
循环将不会执行,但最后一个元素的
getNext()
null,因为它位于列表的末尾。您需要添加以下行:

System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
在while循环之后打印最后一个元素


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

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

else {
    Node temp = start;

    while(temp.getNext() != null) {
        System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
        temp = temp.getNext();
    }
}
while(temp.getNext()!=null)
表示如果
temp.getNext()
null
,则
while
循环将不会执行,但最后一个元素的
getNext()
null,因为它位于列表的末尾。您需要添加以下行:

System.out.println("ID : " + temp.getID() +  " Name : " + temp.getName());
在while循环之后打印最后一个元素

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

我将使用以下方法:

while(temp.hasNext()) {
    ...
}
然后,您也将使用最后一个元素进入循环。您正在执行两次丢失元素
getNetxt()

我将使用以下方法:

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

然后,您也将使用最后一个元素进入循环。您两次丢失元素
getNetxt()

问题在于while循环,请尝试以下方法

while(true) {

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

}

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

while(true) {

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

}

您不需要在
display()
中调用
temp.getNext()
两次。 您可以使用:

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()
检查循环是否应该停止时,您错过了最后一个元素。

您不需要在
display()
中调用
temp.getNext()
两次。 您可以使用:

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()
检查循环是否应该停止时,您错过了最后一个元素。

嗨,TangoKilo,谢谢您的回复!我可以知道如何修改它以正确输出我的最后一个节点吗?如果在while循环后添加print语句,您应该会得到您想要的结果。嗨,TangoKilo,谢谢您的回复!我可以知道如何修改它以正确输出我的最后一个节点吗?如果您在while循环之后添加print语句,您应该会得到您想要的结果。非常感谢!你帮了我很多忙@很高兴我能帮上忙。如果这解决了您的问题,那么您应该将其标记为已接受。欢迎来到Stack Overflow,非常感谢!你帮了我很多忙@很高兴我能帮上忙。如果这解决了您的问题,那么您应该将其标记为已接受。欢迎来到Stack Overflow,非常感谢!谢谢你非常感谢whoAml!谢谢你最好保持
end
start
变量(或者我称之为
tail
)一致,以便在添加新的
节点时跟踪
链接列表中的最后一个
节点,这样,您就不必每次添加新的
节点时都遍历列表了
您的问题是由display()方法中的循环引起的。想想看:你的最后一个
节点
永远不会有下一个条目……另一个小提示:你最好习惯从你的
节点
类开始为你的类定义toString()方法-定义它以返回你在
链接列表
显示()中使用的格式化输出
方法,您将能够使用
System.out.println(节点)谢谢Germann!你教会了我很多!谢谢最好保持
end
start
变量(或者我称之为
tail
)一致,以便在添加新的
节点时跟踪
链接列表中的最后一个
节点,这样,您就不必每次添加新的
节点时都遍历列表了
您的问题是由display()方法中的循环引起的。想想看:你的最后一个
节点
永远不会有下一个条目……另一个小提示:你最好习惯从你的
节点
类开始为你的类定义toString()方法-定义它以返回你在
链接列表
显示()中使用的格式化输出
方法,您将能够使用
System.out.println(节点)谢谢Germann!你教会了我很多!谢谢@Josephineeo23然后你就可以用有价值的信息对每一个问题进行投票;)@Josephineeo23然后你就可以用有价值的信息对每一个问题进行投票;)