【发布时间】:2017-10-10 03:08:13
【问题描述】:
我正在尝试纠正一种反转双向链表的方法。
template <class T>
void List<T>::reverse() {
reverse(head_, tail_);
}
template <class T>
void List<T>::reverse(ListNode*& startPoint, ListNode*& endPoint) {
if(startPoint == NULL || endPoint == NULL) return;
ListNode* currPoint = *&startPoint;
ListNode* end = endPoint->next;
while(currPoint != end ) {
ListNode* tmp = currPoint->next;
currPoint->next = currPoint->prev;
currPoint->prev = tmp;
if(tmp == end) {
endPoint = startPoint;
startPoint = currPoint;
}
currPoint = tmp;
}
}
所以,head_ 和 tail_ 是指向 DLL 开头和结尾的指针。反转列表的实际过程应该相当简单 - 反转序列中每个 ListNode 的 prev 和 next 指针。
如您所见,我正在尝试使第二种方法可以反转 DLL 的任何子部分。我将在其他方法中使用第二种方法,但现在我唯一的目标是让它用于反转整个列表。我认为最大的问题是head_ 没有得到适当的更新,因为我打印列表时没有任何内容。
当我打印我相当基本的测试时,它只是显示:
Expected: < 9 8 7 6 5 4 3 2 1 0 >
Actual: < >
一个实现在实际输出中显示“9”,但我相当肯定这是因为列表的第一部分被简单地丢弃了。
【问题讨论】:
-
使用调试器单步调试你的程序,看看你的代码哪里出错了。
-
@PaulMcKenzie 我设置了一个断点并逐步执行该函数,但所有 gdb 显示的是列表的内存地址而不是列表中的值,所以我实际上无法告诉它正在执行。
-
ListNode* currPoint = *&startPoint;不应该是ListNode* currPoint = *startPoint; -
另外,您是否首先尝试在没有任何参数的情况下将整个链表反转给
reverse函数?换句话说,整个链表的普通反转?如果你不能编写那个函数,那么尝试编写一个通用的反转不会很好。如果您确实编写了这样一个函数,那么除了两个参数之外,该函数与您向我们展示的函数有什么区别? -
您还应该看到
startNode的prev的next和endNode的next的prev发生了什么变化。理想情况下,应该有另一个变量存储start = startNode->prev。所以最后,你做if(start !==NULL) start->next = endNode和if(end != NULL) end->prev = startNode
标签: c++ loops linked-list doubly-linked-list