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实现。我猜这个问题仍然是相关的,因为这是一个希望了解实现细节的学生。