我正在研究Java中的数据结构。

我有一个链表:

1 -> 2 -> 3 -> 4 -> 5

我想反向链接列表,但要成对出现。

2 -> 1 -> 4 -> 3 -> 5

我写了一个代码,但是没用

private void reversePair(Node headNode) {
    Node tempNode1 = null;
    Node tempNode2 = null;
    Node currentNode = headNode;

    while(currentNode != null && currentNode.getNext() != null) {
        tempNode1 = currentNode.getNext();
        tempNode2 = tempNode1.getNext();

        tempNode1.setNext(currentNode);
        currentNode.setNext(tempNode2);

        currentNode = currentNode.getNext();
    }
}


它变成了1 -> 3 -> 5,我不知道这里的逻辑漏洞是什么。

您能解释一下我的代码和解决方案中的问题吗?

最佳答案

您的代码中有两个问题。第一个是您传递给该方法的节点在该方法之外没有更改,它仍然指向1!
第二个问题是在while循环内...您做类似的事情

temp1-> 2,之后得到temp2-> 3,然后获得2-> 1和1-> 3

2-> 1-> 3-> 4-> ....
那没问题
但现在:

1)正如我所说的headNode,在方法之外,指向1,所以它看到列表为
1-> 3-> 4-> ...

2)下一次迭代交换3和4(4-> 3,3-> 5),但是1仍指向3,它不会改变!因此方法之外的headNode将列表视为1-> 3-> 5-> ...

解决第二个问题应该很容易。第一个比较困难,我建议保存2(新头)并将其作为新头返回。这不是很优雅,您必须将方法调用为headNode = reversePair(headNode),但它应该可以工作。

09-09 18:58