为什么此代码无法反转双向链表

时间:2016-09-03 19:10:36

标签: c++ linked-list reverse doubly-linked-list

我试图避免在这里提出这个问题,但是在看了同一段代码差不多一个小时之后我真的不知道为什么以下代码无法反转双向链表:

Node* Reverse(Node* head) {
    if (head == nullptr) {return head;}
    Node *iter = head, *tail, *newTail;
    while (iter -> next != nullptr) {iter = iter -> next;} //to set the tail pointer
    tail = iter;
    newTail = tail; //the node that will become the tail after reversing is done
    iter = head;

    while (iter != tail) {
        newTail -> next = iter;
        iter -> prev = newTail;
        newTail = iter;
        iter = iter -> next;
    }

    newTail -> next = nullptr;
    tail -> prev = nullptr;
    return tail;
}

我将不胜感激。

编辑似乎代码与我的想法无关。哇。作为旁注,我只完成了不包括指针的入门编程课程,更不用说链接列表了。感谢您的帮助!

最终代码 如果你有兴趣,我已经完成了我的算法来反转一个双向链表。我认为这是一个很好的方法,虽然我当然愿意接受建议。

node *reverse(node *head)
{
    if (head == nullptr) {return head;}
    node *iter, *tail, *temp, *newTail;
    while (iter -> next != nullptr) {iter = iter -> next;}
    tail = iter;
    newTail = tail;
    iter = tail -> prev;
    while (iter != nullptr)
    {
        temp = iter -> prev;
        newTail -> next = iter;
        iter -> prev = newTail;
        newTail = iter;
        iter = temp;
    }
    tail -> prev = nullptr;
    newTail -> next = nullptr;
    return tail;
}

2 个答案:

答案 0 :(得分:1)

在代码中,newTail总是一个接一个。在while循环中,newTail-> next设置为iter,iter-> prev设置为newTail。这没有效果。

也许这个图表有帮助

enter image description here

试试这个。它循环遍历列表,并为每个节点交换next和prev指针。 (这可能不是最有效的算法。)

Node* Reverse2(Node* head) {
  if (head == nullptr) {return head;}
  Node *iter = head;

  Node *tail = nullptr;
  while (iter!=nullptr) {
    tail = iter; //keep track of tail

    Node *tmp = iter->next; //before swap, pre-fetch next node

    swap(iter);

    iter=tmp; //go to next node
  }

  return tail;

}

void swap(Node *n) {
  Node *tmp = n->prev;
  n->prev = n->next;
  n->next = tmp;
}

答案 1 :(得分:0)

假设你有3个元素,将它们编号为0,1,2。所以你从newTail开始指向最后一个元素(2)。然后从头开始(0)并设置mov。那么现在2与0相关联?这听起来不像是在颠倒清单。