c++ - 替换链表头的问题

标签 c++ linked-list

编写一个函数在链表上插入头部。它的一半工作是将对象插入头部并重新附加列表,但我以某种方式丢失了列表中的原始头节点。

如果列表是 [green, red, blue] 并且我尝试插入黄色,它会工作但新列表将是 [yellow, red, blue]。

节点类是:

template<class T>
class Node
{
public:
    Node(T theData, Node<T>* theLink) : data(theData), link(theLink){}
    Node<T>* getLink( ) const { return link; }

    const T& getData( ) const { return data; }

    void setData(const T& theData) { data = theData; }
    void setLink(Node<T>* pointer) { link = pointer; }

private:
    T data;
    Node<T> *link;
};

List存储到一个队列中,所以head insert是那个类的一个方法。队列前后都有私有(private)变量指向链表的相应位置。

template<class T>
void Queue<T>::headInsert(T& theData)
{
   Node<T> *temp;
   temp = front->getLink();
   front->setLink(new Node<T>(theData, temp->getLink() ));
   front = front->getLink();
}

最佳答案

你的问题在你的setLink调用:

template<class T>
void Queue<T>::headInsert(T& theData)
{
   Node<T> *temp;
   temp = front->getLink();
   front->setLink(new Node<T>(theData, temp->getLink() )); // Right here
   front = front->getLink();
}

你实际上有很多问题。首先,假设我们有以下测试列表:

front = Red -> Green -> Blue -> NULL

来电temp = front->getLink()产生以下输出:

temp = Green -> Blue -> NULL .

new Node<T>(theData, temp->getLink())打电话,哪里theData = Yellow ,然后产生:

new Node<T>(theData, temp->getLink()) = Yellow -> Blue -> NULL .

调用 front->setLink(new(...)然后给你:

front = Red -> Yellow -> Blue -> NULL

最后,front = front->getLink() :

front = Yellow -> Blue -> NULL .

这不是你想要的。你只想拿yellow并将其弹出到列表的前面:

template<class T>
void Queue<T>::headInsert(T& theData)
{
   front = new Node<T>(theData, front);
}

无需修改内部指针。只需指向前面成为包含您的数据的新节点,它的 next 指针指向旧数据。

关于c++ - 替换链表头的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13676746/

相关文章:

c++ - 为什么类中不允许函数模板特化?

java - 如何按值而不是键对 HashMap 进行排序

c - C 中指向单链表指针的指针

c++ - 特化模板化静态常量成员时避免多重定义的符号

c++ - 按类型检索可变参数类的给定成员

c++ - 检查给定日期是夏令时还是冬令时的例程

c++ - 带有自定义类比较器的 STL 映射不起作用

python - 如何创建一个方法来显示带有数据的链表和指向屏幕上下一个节点的指针?

Java链表打印

language-agnostic - 有索引链表的已知实现吗?