交换链接列表节点后,递归toString函数的堆栈溢出

我在交换链结列表的头节点和另一个节点后,在链结列表上使用递归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);
}
wokun688 回答:交换链接列表节点后,递归toString函数的堆栈溢出

这是因为在部分

top = n2;
top.setLink(n1.getLink());

n1.getLink()仍指向n2,因此您使top.getLink()指向top

,

如果n1n2相距2个节点,则您的方法有效,在这种情况下,它们彼此相邻,如您在执行此行的示例中所示:

top.setLink(n1.getLink());

您正在指向n2自身链接。 您需要检查n1n2以及它们是否确实指向n2n1.linkn2.linkn2.link到{{1 }}。

本文链接:https://www.f2er.com/2982478.html

大家都在问