我正在研究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)
,但它应该可以工作。