Data structures 理解线性链表
我在理解线性链表数据结构时遇到一些问题。以下是我定义列表元素的方式:Data structures 理解线性链表,data-structures,recursion,Data Structures,Recursion,我在理解线性链表数据结构时遇到一些问题。以下是我定义列表元素的方式: class Node{ Object data; Node link; public Node(Object pData, Node pLink){ this.data = pData; this.link = pLink; } } 为了保持简单,我们说列表是链接节点,所以我们不需要定义类列表(递归原理) 我的问题是,在理解节点是如何连接的,更准确地说是连接节
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);
什么是链接?它是上一个元素还是下一个元素?有没有其他建议可以帮助我理解此数据结构?在单链表中,它是“下一步” 它看起来像Java,尽管您没有将其标记为Java。如果这是真的,考虑使用泛型:
public class Node<T>
{
T value;
Node<T> next;
}
公共类节点
{
T值;
节点下一步;
}
在单链表中,它是“下一步”
它看起来像Java,尽管您没有将其标记为Java。如果这是真的,考虑使用泛型:
public class Node<T>
{
T value;
Node<T> next;
}
公共类节点
{
T值;
节点下一步;
}
链接
是对列表中下一个节点的引用
因此,您将从列表中的第一个节点开始,n1
,您可以直接引用它。要获取列表中的第二个节点,请参考n1.link
要迭代列表,您必须有一些起点,例如n1
,然后重复引用link
:
Node n = n1;
while (n != null) {
println(n.data);
n = n.link;
}
链接
是对列表中下一个节点的引用
因此,您将从列表中的第一个节点开始,n1
,您可以直接引用它。要获取列表中的第二个节点,请参考n1.link
要迭代列表,您必须有一些起点,例如n1
,然后重复引用link
:
Node n = n1;
while (n != null) {
println(n.data);
n = n.link;
}
我有两个建议 首先,关于“这是上一个元素还是下一个元素”:这取决于您的数据结构。通常它是下一个元素 其次,我建议使用指针或引用。(C++的语法不正确:<代码> < <代码>是指针,而<代码>新< /Cord>运算符也返回指针。但是,如果您没有指定C++,也不确定是否使用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对应结构。我有两个建议 首先,关于“这是上一个元素还是下一个元素”:这取决于您的数据结构。通常它是下一个元素 其次,我建议使用指针或引用。(C++的语法不正确:<代码> < <代码>是指针,而<代码>新< /Cord>运算符也返回指针。但是,如果您没有指定C++,也不确定是否使用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对应物。也许这幅图会帮助你理解 (请注意,箭头是Java的引用而不是指针)
“列表”将是对第一个节点的引用。也许这张图会帮助您理解 (请注意,箭头是Java的引用而不是指针)
“列表”将是对第一个节点的引用。是的,它有一个Java列表接口和一个LinkedList实现。我猜这个问题仍然是相关的,因为这是一个学生想要了解实现细节。是的,有一个Java列表接口和一个LinkedList实现。我猜这个问题仍然是相关的,因为这是一个希望了解实现细节的学生。