编写一个函数在链表上插入头部。它的一半工作是将对象插入头部并重新附加列表,但我以某种方式丢失了列表中的原始头节点。
如果列表是 [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/