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

时间:2014-02-03 20:03:19

标签: 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;

};

3 个答案:

答案 0 :(得分:2)

您的swap<T>函数不起作用:它交换指针,这些指针按值复制到函数的局部变量中,这对调用者没有影响。

删除您自己的swap并将其替换为std::swap将解决此问题。

答案 1 :(得分:1)

由于您按值传递了两个指针,因此对ab的更改不会传播出swap()函数,从而使其成为无操作。

修复它的一种方法是通过引用传递指针:

template <class T> void swap(T*& a, T*& b) { 

或者(最好)只使用std::swap()而不是你自己的功能。

答案 2 :(得分:0)

如果您公开了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