【问题标题】:Javascript: Linked List: Unable to delete object referenceJavascript:链接列表:无法删除对象引用
【发布时间】:2014-03-15 08:02:46
【问题描述】:

我正在做一个链表数据结构。原型包括一个方法来弹出(删除)列表中的最后一项,我试图通过查找最后一个对象来完成,然后将其设置为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

希望能提供一些见解,以及有关改进功能的任何其他提示。谢谢!

【问题讨论】:

    标签: javascript oop linked-list


    【解决方案1】:

    我猜你意识到你的 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]。如果你真的需要在实际项目中使用链表,那就不要了。

    【讨论】:

    • 啊,完全有道理!是的,这是一个数据结构和算法的编程练习,只是为了好玩而尝试着把它拿出来。谢谢!
    • 实际上,从列表的前面到pushpop 会更快。节省您遍历它的需要。只需保存对rootNode 的引用,将rootNode 引用设置为其nextNode,将原始节点的nextNode 引用设置为null 并返回它。推也一样。您需要遍历列表的唯一原因是您想强制执行队列而不是堆栈行为。
    猜你喜欢
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多