C++ 反转链接列表c++;
可能重复:C++ 反转链接列表c++;,c++,linked-list,reversing,C++,Linked List,Reversing,可能重复: 我正在尝试反转链接列表: void LinkedList::reverseList() { Node *next=_head; Node *prev=0; while(next!=0) { Node *tmp=next->_next; next->_next=prev; prev=next; next=tmp; } } 假设列表是:4->3->2->1 当我打印列表
我正在尝试反转链接列表:
void LinkedList::reverseList()
{
Node *next=_head;
Node *prev=0;
while(next!=0)
{
Node *tmp=next->_next;
next->_next=prev;
prev=next;
next=tmp;
}
}
假设列表是:4->3->2->1
当我打印列表时,我只看到1(打印功能很好)
有什么帮助吗
谢谢试试这样的东西 双链接列表:
for (Node * n = _head, * next; ; n = next)
{
next = n->next;
std::swap(n->next, n->prev);
if (next == NULL) { _head = n; break; }
}
for (Node * n = _head, * prev = NULL, * next; ; prev = n, n = next)
{
next = n->next;
n->next = prev;
if (next == NULL) { _head = n; break; }
}
单链表:
for (Node * n = _head, * next; ; n = next)
{
next = n->next;
std::swap(n->next, n->prev);
if (next == NULL) { _head = n; break; }
}
for (Node * n = _head, * prev = NULL, * next; ; prev = n, n = next)
{
next = n->next;
n->next = prev;
if (next == NULL) { _head = n; break; }
}
我喜欢递归;更容易掌握和验证
Node* LinkedList::reverseList() { // returns tail
if (!_head || !_head->_next)
return _head;
Node* const h = _head;
_head = _head->_next;
h->_next = NULL;
return reverseList()->_next = h;
}
既然你说你想自己找到问题,我就给你一个提示,而不是解决办法 您的
reverse
功能的工作原理是成功地反转列表。这不是问题所在。您可能有两次调用print
。一个在前面,一个在后面。在这两种情况下,关于传递给print
的节点,您注意到了什么?这告诉你什么
编辑:
既然你说你已经发现了问题,我就发布实际的解决方案
在您的反向
代码中,您从不更新列表的\u头
,但是当您反向
列表时,头实际上从4
更改为1
。由于您从不更新\u head
,当您第二次调用print
时(在反向调用之后),您将从1
开始打印,这是列表的结尾,这是唯一打印的节点
解决方案是在您反转列表时更新\u head
。最简单的方法就是在每次迭代中更新它。这可能比其他可能的解决方案效率稍低,但不会改变算法的时间复杂度——仍然是O(n):
是的,它是C++,给出节点的一些方法。允许它们交换在列表中的位置,而不交换其值。然后找到列表的两端并交换它们,继续工作直到到达两端的相同节点或刚交换的节点。您从未分配\u head
,是吗?添加\u head=prev代码>在之后,而循环。我尝试了,但没有帮助。我仍然得到>>1作为输出。它应该,真的。如果在while
循环之后添加\u head=prev
,则您的代码与我的答案完全相同。我也试过并验证了它。我的第一个想法是正确的,但它似乎是一个单一的链表。从来没有提到过n->prev
:)好的,我做了两个版本,一个是双份的,一个是单份的。我试试这个。。有人能解释为什么我的代码不起作用吗?我在这里遗漏了什么?@Maroun85:Xeo不是已经解释过了吗?您从未在代码中重新分配\u head
。printList函数不接收任何参数,它从\u head开始,然后移动到列表的末尾(直到0是最后一个节点的下一个)…现在我得到了它。。非常感谢:)不客气。你想让我现在发布解决方案吗?当然。。现在我修正了:)我应该在打印功能上“移动”一个“头”,而不是“头”本身。@Maroun:Ouch,这是个坏主意,是的。:)不过,如果您让打印成员常量,您会注意到这一点!如void print()常量{…}
中所示。