好的,我正在学习如何打印一个链表。我有所有的方法,我需要使用的列表,但是我不知道如何显示节点的值。现在我的main方法中什么都没有,因为我在尝试调用main中的非静态方法时总是遇到错误。我有一个toString方法来显示列表的内容。如何调用toString来显示每个节点的值呢?如果您有任何建议,我们将不胜感激。
下面是节点类:
public class LinkedListNode
{
private int data;
private LinkedListNode next;
public LinkedListNode(int data)
{
this.data = data;
this.next = null;
}
public int getData()
{
return data;
}
public void setData(int d)
{
data = d;
}
public LinkedListNode getNext()
{
return next;
}
public void setNext(LinkedListNode n)
{
next = n;
}
}
以下是包含用于操作列表的main和方法的LinkedList类:
public class LinkedList {
public LinkedListNode head;
public static void main(String[] args) {
LinkedList l = new LinkedList();
l.insertFront(0);
System.out.println(l.toString());
}
public LinkedList() {
this.head = null;
}
public int removeFront(){
if(head == null){
System.out.println("Error - Attempting to call removeFront() on empty list");
return 0;
}else{
int temp = head.getData();
head = head.getNext();
return temp;
}
}
public void insertFront(int data){
if(head == null){
head = new LinkedListNode(data);
}else{
LinkedListNode newNode = new LinkedListNode(data);
newNode.setNext(head);
head = newNode;
}
}
public void insertBack(int data){
if(head == null){
head = new LinkedListNode(data);
}else{
LinkedListNode newNode = new LinkedListNode(data);
LinkedListNode current = head;
while(current.getNext() != null){
current = current.getNext();
}
current.setNext(newNode);
}
}
public int removeBack(){
if(head == null){
System.out.println("Error - Attempting to call removeBack() on empty list");
return 0;
}else if (head.getNext() == null){
int temp = head.getData();
head = null;
return temp;
}else{
LinkedListNode current = head;
while(current.getNext().getNext() != null){
current = current.getNext();
}
int temp = current.getNext().getData();
current.setNext(null);
return temp;
}
}
public String toString(){
String retStr = "Contents:\n";
LinkedListNode current = head;
while(current != null){
retStr += current.getData() + "\n";
current = current.getNext();
}
return retStr;
}
public LinkedListNode getHead() {
return head;
}
public void setHead(LinkedListNode head) {
this.head = head;
}
}
6条答案
按热度按时间ygya80vv1#
fcy6dtqo2#
正如在其他一些答案和注解中所指出的,这里缺少的是对JVM System类的调用,以打印出toString()方法生成的字符串。
这将完成工作,但我不建议这样做。如果我们看一下Object类的javadoc,我们会发现toString()的描述如下:
返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。结果应该是一个简洁但信息丰富的表示形式,便于用户阅读。建议所有子类都重写此方法。
这里强调的是我自己的。你正在创建一个包含链表的整个状态的字符串,这可能是使用你的类的人所不期望的。我建议做以下修改:
1.将toString()方法添加到LinkedListNode类。
1.更新LinkedList类中的toString()方法,使其更加简洁。
1.向LinkedList类添加一个名为printList()的新方法,该方法执行您当前期望toString()执行的操作。
在链接列表节点中:
在链接列表中:
tjjdgumg3#
当
JVM
试图运行您的应用程序时,它静态地调用您的main方法;就像这样:这意味着
LinkedList
类没有示例。为了调用toString()
方法,可以创建LinkedList
类的一个新示例。所以
main
方法的主体应该是这样的:bxpogfeg4#
我是这样做的:
jdgnovmf5#
一个非常简单的解决方案是将
override
的toString()
方法放在Node
中,然后通过传递LinkedList
的head
调用print,不需要实现任何类型的循环。编码:
yptwkmov6#
对于@Marin代码,它不包括列表是否为空或列表是否只包含1个节点。因此,下面是改进后的代码: