Javascript:链接列表:无法删除对象引用

标签 javascript oop linked-list

我正在做一个链表数据结构。该原型(prototype)包括一个从列表中弹出(删除)最后一个项目的方法,我试图通过找到最后一个对象,然后将其设置为 null 来完成。它似乎不起作用。起作用的是将前一个对象中的引用(“指针”)设置为 null。我仍然是一个相对的 JS OOP 新手,无法让我的大脑理解为什么。代码:

function LinkedList() {
    this._rootNode = null;
    this._length = 0;                                       
}

LinkedList.prototype = {

   push: function(data) {
       var newNode = {
           data: data,                                      
           nextNode: null
       };
       // initialize this._rootNode or subsequent .nextNode with newNode
       this._length++;
   },

   pop: function() {
       var selectedNode, perviousNode;

       if ( this._rootNode ) {
           if ( this._length > 1 ) {
               selectedNode = this._rootNode;
               while ( selectedNode.nextNode ) {
                   previousNode = selectedNode;  // <-- shouldn't need this?
                   selectedNode = selectedNode.nextNode;
               }
               selectedNode = null;              // <-- doesn't delete it
               // previousNode.nextNode = null;  // <-- works (but feels unnecessary?)
           } else {  
               this._rootNode = null;
           }
           this._length--;
       }
   },

   // more methods..
};


/* --- Main Prorgam --- */

var list = new LinkedList();

list.push('AAA');
list.push('BBB');
list.pop();
console.log(list._rootNode.nextNode.data);   <-- 'BBB' still there

将不胜感激一些见解,以及任何其他关于改进功能的提示。谢谢!

最佳答案

我猜你意识到你的 push 方法不起作用,但你还没有问过那个。

如果您正在做某种学校项目,要求您编写这样的链表,那么一定要继续。你的问题是 selectedNode 并不是真正的“节点本身”,它是对它的引用,你只是将该引用设置为 null 而前一个项目的 nextNode 指针仍然引用它,所以你实际上并没有将它从你的列表中删除。实际上,您可以通过取消注释将指针设置为 null 的行来执行此操作,这意味着您还必须保留保存对前一个节点的引用的行。

previousNode.nextNode = null;

您实际上不想用pop() 完全删除节点,您想要返回它。但是,一旦您在调用函数中删除了对弹出节点的引用,它将成为最后一个引用,并且该对象将可用于垃圾回收。这就是(据我所知)所有传统 OOP 语言在基本级别处理链表的方式。

这让我想到了我的下一个观点,即现在您将使用的大多数 OOP 语言实际上并不需要您在基础水平上工作。它们中的大多数都有可以为您实现链表的库,尤其是 Javascript 在其数组语法中本质上实现了链表样式的数据结构。到 ([1,2,3,4]).pop() 计算为 4([1,2,3,4] ).push(5) 的计算结果为 [1,2,3,4,5]。如果您确实需要在实际项目中使用链表,请不要使用。

关于Javascript:链接列表:无法删除对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805129/

相关文章:

matlab - 检索添加到 MATLAB OOP 中的类的动态属性列表

java - 在多项式方程中合并相似项

c++ - 追加链表程序崩溃

Javascript - 无法动态创建选中的复选框

javascript - 使用 jQuery 捕获页面链接

php - Laravel Schema 设计多对多

c++ - 我如何拆除多线程 C++ 中的观察者关系?

java - 防止容器隐藏时java小程序被破坏

javascript - Vuejs Bootstrap 选择文本不更新

c - 在 C 中打印整数链表