我在交换链结列表的头节点和另一个节点后,在链结列表上使用递归toString函数时,出现堆栈溢出。我不确定为什么会这样,并希望我能对实际情况有所了解。似乎在执行交换功能之前,toString可以正常工作,但是一旦交换节点,我就会在递归toString函数中碰到堆栈溢出错误。
我的链接列表类别:
public class LinkedList {
//
//Instance variable
//
private Node top;
//
//Instance and static methods below
//
//accessor for the top Node
public Node getTop() {
return top;
}
public Node getPreviousnode(Node toFind) {
//call getPreviousnodeRec() method
if (top.equals(toFind))
return null;
else
return getPreviousnodeRec(top,toFind);
}
private Node getPreviousnodeRec(Node start,Node toFind) {
if (start.getLink().equals(toFind)) {
return start;
} else
return getPreviousnodeRec(start.getLink(),toFind);
}
public void swap(Node n1,Node n2) {
if (top.equals(n1)) {
System.out.println("top equals n1");
Node n2prev = getPreviousnode(n2);
Node temp = n2.getLink();
top = n2;
top.setLink(n1.getLink());
n1.setLink(temp);
n2prev.setLink(n1);
System.out.println("complete");
}
}
public String toString() {
if (top == null)
return "There is nothing in the list!";
else {
String value = "";
return toStringRec(top,value);
}
}
private String toStringRec(Node start,String value) {
if (start.getLink() != null) {
value += start.getData()+"\n";
return toStringRec(start.getLink(),value);
} else
return value+start.getData();
}
public void setTop(Node top) {
this.top = top;
}
}
现在,我只是想测试一种情况下的交换方法(top = n1)。
这是我的主要方法:
public static void main (String[] args) {
//Testing the getPreviousnode method
LinkedList myList = new LinkedList();
myList.add(-700);
myList.add("hello");
myList.add(12);
myList.add(55);
myList.add(13000);
myList.add("world");
myList.add("pizza");
myList.add(870);
System.out.println("The previous node of the node containing 12 is the Node containing \"hello\":");
System.out.println(myList.getPreviousnode(
myList.getTop().getLink().getLink()).getData());
System.out.println();
//Testing swap:
System.out.println("The initial list is:");
System.out.println(myList);
System.out.println();
System.out.println("Now swapping the first and second nodes,and the result is:");
myList.swap(myList.getTop(),myList.getTop().getLink());
System.out.println(myList);
}