Pointers Dart编程中的链表,如何处理Dart中的指针或如何在堆上存储变量?

Pointers Dart编程中的链表,如何处理Dart中的指针或如何在堆上存储变量?,pointers,dart,Pointers,Dart,我总是得到空值。我是这门语言的初学者。谢谢你的理解 class Node{ int data; Node next; Node(int value){ data = value; } } void addNode(Node headNode, int aValue){ Node newNode = new Node(aValue); //creating new node newNode.next = headNode;

我总是得到空值。我是这门语言的初学者。谢谢你的理解

class Node{
    int data;
    Node next;

    Node(int value){
        data = value;
    } 
}

void addNode(Node headNode, int aValue){
    Node newNode = new Node(aValue); //creating new node
    newNode.next = headNode;         // pointing the next to headNode
    headNode = newNode;              // updating the head Node
}

void main(){
    Node head = Node(1);
    addNode(head,2);
    addNode(head,3);

    print(head.next.data); //here I always get null
}

我们将非常感谢您的帮助。

请考虑在哪里更新
头节点的值。你到底分配给那里什么

headNode
具有功能范围,这意味着它只存在于
addNote
功能中。类似地,
main
函数中的
head
也有函数作用域,因此它只能在主函数中访问

似乎您正试图从
addNode
中更新
head
,但这不是您现在拥有的

一种可能的解决方案是从
addNode
返回新创建的节点,并使用返回的值在
main
函数中重新分配
head
。它看起来像这样:

Node addNode(Node headNode, int aValue){
    Node newNode = new Node(aValue);
    newNode.next = headNode;
    return newNode;
}

void main(){
    Node head = Node(1);
    head = addNode(head,2);
    head = addNode(head,3);

    print(head.next.data);
}

还有一件事需要考虑:当程序执行到末尾时,列表是什么样子的?是
[1]>[2]>[3]
还是
[3]>[2]>[1]

我们可以看到结构像一个堆栈。我创建了addNode来自动化将节点链接在一起的过程。在堆栈中,最后插入的节点将是头节点或第一个出现的节点。这就是我的问题,在dart中是否可以将hedNode作为参考传递给我,以便我可以在内存中操作它?意思列表应该是这样的……3>2>1对不起,我不清楚您的问题
headNode
通过引用传递到
addNode
。当你说你想在记忆中操纵它的时候,我不知道你在想什么。关于插入顺序,我的答案中的解决方案确实会将节点推到堆栈顶部。如果这是您想要的,那么代码应该可以按原样运行。当您想要弹出堆栈时,只需在
头部取
数据
值,然后用
头部替换
头部
。接下来
@EricEchemane否,Dart中的所有内容都是按值传递的(或者可以说,可能是更清晰的术语)。如果希望函数修改值。在这种情况下,最好创建一个单独的
LinkedList
类来存储对头部和尾部的引用。或者只使用现有的from
dart:collection
@jamesdlin您是对的,dart中的所有内容都是按值传递的。为了得到我的答案,我把事情简化了一点。我认为,试图解释一切是如何通过值传递的,但对象可以从函数内部进行变异,而原语不能在注释中进行变异。不过你的链接很好。虽然Eric可以直接使用dart:collection中的LinkedList,但如果他只是在学习,那么自己实现它来理解它的工作原理是有价值的。