实现 toString 方法以打印出 LinkedList



我在处理 OOP 类的项目时遇到问题。我快完成了,但仍然缺少 toString 方法和主方法。不太确定该怎么做,希望得到任何帮助。 我希望我的toString方法按如下方式运行:

返回列表中存储的所有项的字符串表示形式。空列表的字符串表示形式如下所示head--><--tail非空列表的字符串表示形式如下所示:head-->134<-->-8<-->42<-->1<--tail

public class IntegerNode{
private IntegerNode next;
private IntegerNode prev;
private int data;
public IntegerNode(int data){
next = next; 
prev = prev;
data = data;     
}
public int getData(){
data = data;
return this.data;   
}
public IntegerNode getNext(){
return next;
}
public IntegerNode getPrevious(){
return prev;
}
public void setNext(IntegerNode in){
prev = in;
}
public void setPrevious(IntegerNode in){
prev = in;
}
}

这是我到目前为止在我的 IntegerLinkedList 类中拥有的内容

public class IntegerLinkedList{
private IntegerNode head;
private IntegerNode tail;
public IntegerLinkedList(){
head = null;
tail = null;
}
public void addFirst(int x){
IntegerNode nH = new IntegerNode(x);
if (head == null) {
head = nH;
tail = nH;
}else{
head.setPrevious(nH);
nH.setNext(head);
head = nH;
}
}
public void addLast(int x){
IntegerNode t = new IntegerNode(x);
if (tail == null){
head = t;
tail = t;
}else{
tail.setNext(t);
t.setPrevious(tail);
tail = t;
}
}
public int peekFirst(){
return head.getData();
}
public int peekLast(){
return tail.getData();
}
public String toString(){
if (head == null && tail == null){
String empty = "head--><--tail";
return empty;
}else{
String h = "Head--> " + head;
String t = tail + " <--Tail";
String m = " <--> ";
// while(IntegerNode.getNext() != null) 
//}
//return h + m + t;
}
}
public int pollFirst(){
int x = head.getData();
head = head.getNext();
head.setPrevious(null);
return x;
}
public int pollLast(){
int x = tail.getData();
tail = tail.getPrevious();
tail.setNext(null);
return x;
}
}

我在想一段时间循环是去这里的方式,但话又说回来,我不确定。

这是怎么写的:

@Override  // <-- Annotate that you are overriding the toString() method
public String toString(){
if (head == null && tail == null){
String empty = "head--><--tail";
return empty;
}else{
StringBuilder sb = new StringBuilder();
sb.append("Head-->");
IntegerNode curr = head;
sb.append(curr.getData());
curr = curr.getNext();
while(curr != null) {
sb.append("<-->");
sb.append(curr.getData());
curr = curr.getNext();
}
sb.append("<--tail");
return sb.toString();
}
}

作为替代方法,您可以简化逻辑,使其没有外部(如果不是):

@Override  // <-- Annotate that you are overriding the toString() method
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("Head-->");
IntegerNode curr = head;
if (curr == null)
{
sb.append("<--tail");
return sb.toString();
}
sb.append(curr.getData());
curr = curr.getNext();
while(curr != null) {
sb.append("<-->");
sb.append(curr.getData());
curr = curr.getNext();
}
sb.append("<--tail");
return sb.toString();
}

是的,您必须使用循环,因为您想要迭代未知长度的数据。迈克尔·马基迪斯写出答案的速度比我快,使用他的解决方案,但是我建议对你的代码进行一些改进。

String h = "Head--> " + head;不起作用,因为 head 是一个对象IntegerNode,并且您想像这样head.getData()访问其数据(还有为什么要在此方法中分配data = data;?它应该只返回)

如果要在构造函数中分配与字段同名的数据,请使用 必须使用this关键字来明确要分配的内容。此外,分配 nullnextprev也没有意义,所以这段代码

public IntegerNode(int data){
next = next; 
prev = prev;
data = data;     
}

应该看起来像这样

public IntegerNode(int data){
this.data = data;     
}

或者如果要分配上一个和下一个节点

public IntegerNode(int data, IntegerNode next, IntegerNode prev){
this.next = next; 
this.prev = prev;
this.data = data;     
}

如果您使用的是Java 8+,StringJoiner会让您变得容易。

@Override
public String toString() {
StringJoiner joiner = new StringJoiner("<-->", "head-->", "<--tail");
for (IntegerNode node = this.head; node != null; node = node.getNext())
joiner.add(String.valueOf(node.getData()));
return joiner.toString();
}

如果不使用Java 8,StringBuilder是正确的方法。
  (性能优于直接使用String)

@Override
public String toString() {
StringBuilder buf = new StringBuilder("head-->");
boolean sep = false;
for (IntegerNode node = this.head; node != null; node = node.getNext()) {
if (sep)
buf.append("<-->");
buf.append(node.getData());
sep = true;
}
return buf.append("<--tail").toString();
}

在这两种情况下,您都使用带有node变量的基本for循环来循环访问列表。


至于你的其余代码,你有一些问题。

public IntegerNode(int data){
next = next; 
prev = prev;
data = data;     
}

next分配给nextprev分配给prev是没有意义的。
仅当您使用this.限定字段时,将参数分配给字段才有效,否则您将参数分配给其自身(毫无意义)。

public IntegerNode(int data){
this.data = data;     
}

public int getData(){
data = data;
return this.data;   
}

data分配给data是没有意义的。

public int getData(){
return this.data;   
}

public void setNext(IntegerNode in){
prev = in;
}

复制/粘贴错误。你的意思是分配给next.

public void setNext(IntegerNode in){
next = in;
}

public int pollFirst(){
int x = head.getData();
head = head.getNext();
head.setPrevious(null);
return x;
}
public int pollLast(){
int x = tail.getData();
tail = tail.getPrevious();
tail.setNext(null);
return x;
}

当您轮询列表中的最后1个值时,这些方法将抛出NullPointerException
添加缺少if语句。

public int pollFirst(){
int x = head.getData();
head = head.getNext();
if (head == null)
tail = null;
else
head.setPrevious(null);
return x;
}
public int pollLast(){
int x = tail.getData();
tail = tail.getPrevious();
if (tail == null)
head = null;
else
tail.setNext(null);
return x;
}

1)"最后"是指"仅剩"的值,而不是"尾部"值。

最新更新