【问题标题】:Linked list in Dart programming, How to deal with pointers in Dart or how to store a variable on the Heap?Dart 编程中的链表,如何处理 Dart 中的指针或如何在 Heap 上存储变量?
【发布时间】:2021-02-11 10:17:31
【问题描述】:

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

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
}

您的帮助将不胜感激。

【问题讨论】:

    标签: pointers dart


    【解决方案1】:

    考虑在哪里更新headNode 的值。你到底给那里分配了什么?

    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。当您说要在内存中操作它时,我不确定您在做什么。关于插入顺序,我的答案中的解决方案确实会将节点推到堆栈的顶部。如果这是您的意图,那么代码应该可以按原样进行。当您想要弹出堆栈时,只需在 head 处获取 data 值,然后将 head 替换为 head.next
    • @EricEchemane 不,Dart 中的所有内容都是按值传递的(或者可以说,pass-by-assignment 可能是一个更清晰的术语)。如果你想要一个函数来修改一个值,you'll need to wrap it in another object first。在这种情况下,您最好创建一个单独的LinkedList 类来存储对头部和尾部的引用。或者只使用来自dart:collection 的现有LinkedList class
    • @jamesdlin 你是对的,Dart 中的一切都是按值传递的。我为我的回答简化了一些事情。我认为试图解释一切是如何通过值传递的,但是对象可以从函数内部发生变异,而基元不能超过在评论中的合适程度。不过,您的链接是一个很好的链接。虽然 Eric 可以只使用 dart:collection 中的 LinkedList,但如果他只是在学习,那么自己实现它以了解它的工作原理是有价值的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2017-05-03
    • 2021-09-03
    相关资源
    最近更新 更多