[英]Reversing a generic doubly-linked list in C++
我试图给我的通用列表类一个反向函数。 由于某种原因,我的算法在测试时无法正常工作。 我认为这是有道理的:将指针交换到列表的第一个和最后一个节点,然后遍历列表,对于每个节点,将其指针交换到上一个和下一个节点。
伙计们,对我好一点。 我正在尝试一些通用编程的实践。 教我C ++纯粹主义者的方式。
这是交换功能:
template <class T> void swap(T* a, T* b) {
T* tempPtr = a;
a = b;
b = tempPtr;
}
这是反向功能:
template <class T> void List<T>::reverse() {
if (size > 1) {
swap(firstNodePtr, lastNodePtr);
node* curNodePtr = firstNodePtr;
while (curNodePtr != NULL) {
swap(curNodePtr->prevNodePtr, curNodePtr->nextNodePtr);
curNodePtr = curNodePtr->nextNodePtr;
}
}
}
这是类,其成员和函数原型:
template <class T> class List {
public:
List();
~List();
void push_back(T);
void push_front(T);
T get_at(unsigned);
unsigned get_size();
void reverse();
private:
struct node {
T val;
node* prevNodePtr;
node* nextNodePtr;
};
node* firstNodePtr;
node* lastNodePtr;
unsigned size;
};
您的swap<T>
函数不起作用:它交换指针,这些指针按值复制到函数的局部变量中,而局部变量在调用方中无效。
删除您自己的swap
并用std::swap
它将解决此问题。
由于您按值传递了两个指针,因此对a
和b
的更改不会传播到swap()
函数之外,从而使其成为无操作。
解决该问题的一种方法是通过引用传递指针:
template <class T> void swap(T*& a, T*& b) {
另外(最好是)只需使用std::swap()
而不是您自己的函数即可。
如果您公开了node
结构(或列表至少为双向迭代器类型),则可以避免整个问题,而只需使用std::reverse
。
List<int> someList;
// fill with data
std::reverse(someList.begin(), someList.end()); // where begin returns a bidirectional iterator for the head, and end returns a bidirectional iterator for 1 element beyond the tail
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.