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

时间:2014-02-15 23:30:04

标签: javascript oop linked-list

我正在做一个Linked List数据结构。原型包括一种方法,通过查找最后一个对象,然后将其设置为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

会欣赏一些有关改进功能的见解和其他任何提示。谢谢!

1 个答案:

答案 0 :(得分:3)

我猜你知道你的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]。如果您确实需要在实际项目中使用链接列表,请不要这样做。