我想知道是否有人可以帮助解释如何在不创建新节点或更改现有节点中的数据的情况下撤消单个链接列表。我正在努力学习决赛,我们在之前的测试中有这个问题。他们没有发布测试编码部分的答案,我也无法弄明白。
他们告诉我们,扭转它的最佳方法是使用“跑步技术”,我相信我明白这是什么。他们将它描述为使用两个指针或计数器来运行列表并收集信息,但我不知道如何使用它来反转一个单独喜欢的列表。我能够强制代码来反转长度为2,3和4的列表,但我无法进行循环或递归执行。任何有关如何处理此事的代码或解释都将不胜感激,谢谢。
答案 0 :(得分:1)
你可以从仅仅一个一个的想法开始派生代码 - 从输入列表中弹出元素并将它们推送到最初为空的结果列表:
NODE reverse(NODE list) {
NODE result = null;
while (list != null) {
NODE head = <pop the first node off list>
<push head onto result>
}
return result;
}
结果将与输入相反。现在用Java代替缺失的部分
NODE reverse(NODE list) {
NODE result = null;
while (list != null) {
// pop
NODE head = list;
list = list.next;
// push
head.next = result;
result = head;
}
return result;
}
你已经完成了......
答案 1 :(得分:0)
这取决于你对列表的实现,但我会递归到最后,然后反转引用。
void Reverse(List pList) {
Reverse(pList, null, pList.First); // initial call
}
void Reverse(List pList, Node pPrevious, Node pCurrent) {
if (pCurrent != null)
Reverse(pList, pCurrent, pCurrent.Next); // advance to the end
else { // once we get to the end, make the last element the first element
pList.First = pPrevious;
return;
}
pCurrent.Next = pPrevious; // reverse the references on all nodes
}