Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:链接列表:无法删除对象引用_Javascript_Oop_Linked List - Fatal编程技术网

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

Javascript:链接列表:无法删除对象引用,javascript,oop,linked-list,Javascript,Oop,Linked List,我正在做一个链表数据结构。原型包括一种方法,通过查找最后一个对象,然后将其设置为null,从列表中弹出(删除)最后一项。它似乎不起作用。工作原理是将前一个对象中的引用(“指针”)设置为null。我还是一个相对的JS OOP新手,我的大脑无法理解为什么。守则: function LinkedList() { this._rootNode = null; this._length = 0; } Linke

我正在做一个链表数据结构。原型包括一种方法,通过查找最后一个对象,然后将其设置为
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
函数链接列表(){
此。_rootNode=null;
这个。_长度=0;
}
LinkedList.prototype={
推送:功能(数据){
var newNode={
数据:数据,
nextNode:null
};
//初始化此。\使用newNode初始化rootNode或后续的.nextNode
这个;
},
pop:function(){
变量selectedNode,perviousNode;
if(此.\u根节点){
如果(此长度>1){
selectedNode=此。\u rootNode;
while(selectedNode.nextNode){

previousNode=selectedNode;//我想您已经意识到您的
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]
。如果你真的需要在实际项目中使用链表,就不要使用。

啊,完全有道理!是的,这是一个数据结构和算法方面的编程练习,只是为了好玩而尝试一下。谢谢!实际上,从链表的前面推送
和弹出会更快。省去你的需要o遍历它。只需保存对
rootNode
的引用,将
rootNode
引用设置为其
nextNode
,将原始节点的
nextNode
引用设置为null并返回它。推送也是如此。如果要强制执行队列而不是堆栈行为,则需要遍历列表的唯一原因是或