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()常量{…}
中所示。