什么';我关于Java中链表的代码有什么问题?
我创建了两个类,即Node和LinkedList。代码是可编译的,但它从不生成我存储在链接列表中的最后一个数据 以这两类为例 Node.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() {
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然后你就可以用有价值的信息对每一个问题进行投票;)