【发布时间】:2017-01-11 15:15:33
【问题描述】:
我试图避免在这里问这个问题,但是在看了将近一个小时的同一段代码之后,我真的不知道为什么下面的代码无法反转双向链表:
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;
}
【问题讨论】:
-
我的工作方式会有所不同。首先到达尾部,然后建立一个新列表。并且总是预取下一个元素。我还要说,在代码操作过程中改变 newTail 的语义是代码异味,可能会导致混乱。还有错误。
标签: c++ linked-list reverse doubly-linked-list