我在理解线性链表数据结构时遇到了一些问题。这是我定义列表元素的方式:
class Node{
Object data;
Node link;
public Node(Object pData, Node pLink){
this.data = pData;
this.link = pLink;
}
}
为了简单起见,我们说列表是链接节点,因此我们不需要定义类列表(递归原理)。
我的问题是我很难理解节点是如何连接的,更确切地说是连接节点时的节点序列。
Node n1 = new Node(new Integer(2), null);
Node n2 = new Node(new Integer(1), n1);
什么是链接?它是前一个还是下一个元素?还有其他建议可以帮助我理解这个数据结构吗?
答案 0 :(得分:5)
也许这张图可以帮助你理解。
(请注意,箭头是引用而非Java的指针)
“list”将是对第一个节点的引用。
答案 1 :(得分:4)
link
是对列表中下一个节点的引用。
因此,您将从列表中的第一个节点n1
开始,您可以直接引用该节点。要获取列表中的第二个节点,请引用n1.link
。
要遍历列表,您必须有一些起点,例如n1
,然后重复引用link
:
Node n = n1;
while (n != null) {
println(n.data);
n = n.link;
}
答案 2 :(得分:1)
在单链表中,它是“下一个”。
它看起来像Java,即使你没有标记它。如果这是真的,请考虑使用泛型:
public class Node<T>
{
T value;
Node<T> next;
}
答案 3 :(得分:0)
我有两个建议。
首先,关于“这是前一个还是下一个元素”:它取决于您的数据结构。通常它是下一个元素。
其次,我建议使用指针或引用。 (并且您的C ++语法不正确:this
是一个指针,new
运算符也会返回一个指针。不确定您是否使用C ++,因为您没有指定语言。)
例如:
class Node {
Object data;
public:
Node *next;
Node (Object pData, Node *pLink) {
this->data = pData;
this->next = pLink;
}
}
这将是一个更有效的结构。然后你可以这样做:
Node *n3 = new Node(new Integer(2), null);
Node *n2 = new Node(new Integer(1), n1);
Node *n1 = new Node(new Integer(3), n2);
或只是
Node *n1 = new Node(new Integer(3), new Node(new Integer(1), new Node(new Integer(2), NULL)));
然后你可以按如下方式遍历列表:
for (Node *current = n1; current != NULL; current = current->next)
{
// do something with the current element
}
我希望这有帮助!
如果你使用的是现代语言,那么在C ++的stl中已经有预制的链表结构,在.NET中它位于System.Collections.Generic中,我确信还有一个Java对应物。