了解线性链表

时间:2011-01-01 19:37:07

标签: data-structures recursion

我在理解线性链表数据结构时遇到了一些问题。这是我定义列表元素的方式:

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);

什么是链接?它是前一个还是下一个元素?还有其他建议可以帮助我理解这个数据结构吗?

4 个答案:

答案 0 :(得分:5)

也许这张图可以帮助你理解。

alt text

(请注意,箭头是引用而非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对应物。