繁体   English   中英

反转C ++中的通用双链表

[英]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它将解决此问题。

由于您按值传递了两个指针,因此对ab的更改不会传播到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM