2012-09-14 166 views
2

更具体地说,我想知道为什么我们在典型的链表实现中使用指针。是否存在以下节点实现可能导致的问题?引用可以替换指针吗?

template <typename T> 
class Node { 
    T data; 
    Node<T>& next; 
    Node<T>& prev; 
}; 

是否有一些原因,我们应该在这里使用指针而不是引用?

+0

如果下一个或上一个节点不是? – chris

+1

这个列表实现在我的图灵机上很好用。 – ssube

+0

引用不能为空,所以你需要某种方式来表示无效/不存在的'next'和/或'prev'。 – Joe

回答

4

创建它们后不能设置引用,这使得不可变的链表实现有点棘手。 (您需要将引用包装到对象中,以便在更改引用时可以重新对其进行引用)。

也无法在引用上设置NULL值,因此表示列表的末尾需要一些想象力。

可能更好地坚持链接列表中的指针,甚至更好,使用std::list<>

+0

或更好的是,除非你只是想学习指针是如何工作的,否则不要使用链表...... –

1

左值引用不能替换指针;他们做不同的事情。

左值引用必须用左值初始化,并且左值引用将引用该对象的剩余生命周期。它不能被反弹。这给你的列表节点提出了两个直接的问题。

如何开始列表?你想构造一个没有“previous”的节点,但prev成员必须用Node对象初始化。你可以想象使用一个Node,它的prev是自己来表示一个列表的头,但这是围绕左值参考的糟糕选择。 (例如,Node<T> emptylist = { T(), emptylist, emptylist }; //eurgh

二,您如何操作列表?您不能更改nextprev的绑定,这意味着更改列表的唯一方法是构建一组全新的节点并复制每个单元。

+1

“引用必须用左值初始化” - 呃...不是真的。 'int const&cr = 5; int && rv = 5;' – Xeo