鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 關(guān)于JS中的鏈表

關(guān)于JS中的鏈表

最近在看數(shù)據(jù)結(jié)構(gòu)與算法JavaScript描述,在鏈表這一章遇到了點問題,問題描述如下

要刪除鏈表中的item節(jié)點,prevNode是item節(jié)點的前一個節(jié)點

書中用了 prevNode.next = prevNode.next.next; 來改變鏈表的指向。
但是我的理解是prevNode.next = item,然后試著利用prevNode.next = item.next刪除鏈表,但是這時候的結(jié)果相當于就把鏈表斷開了,只留下了prevNode和之前的節(jié)點。

希望各路大神能解答一下疑惑,萬分感謝。


感謝 改名字很傷神 的指正,以下是書中的代碼

//Node類表示節(jié)點
    function Node(element){
        this.element = element;
        this.next = null;
    }
    //LinkedList類提供了插入節(jié)點、刪除節(jié)點、顯示列表元素的方法以及其他一些輔助方法
    function LList(){
        this.head = new Node("head");  //head節(jié)點的next屬性被初始化為null,當有新元素插入時,next會指向新的元素,所以這里沒有修改next的值
        this.find = find;
        this.findPrevious = findPrevious;
        this.insert = insert;
        this.remove = remove;
        this.display = display;
    }
    function find(item){
        var currNode = this.head;
        while(currNode.element != item){
            currNode = currNode.next;
        }
        return currNode;
    }
    function insert(newElement,item){
        var newNode = new Node(newElement);
        var current = this.find(item);
        newNode.next = current.next;
        current.next = newNode;
    }
    //remove方法要先找到要刪除item的前一個node
    function findPrevious(item){
        var currNode = this.head;
        while(!(currNode.next==null) && (currNode.next.element!=item)){
            currNode=currNode.next;
        }
        return currNode;
    }
    function remove(item){
        var prevNode = this.findPrevious(item);
        if(!(prevNode.next==null)){
            prevNode.next = prevNode.next.next;   //###########這一句是有疑惑的地方
        }
    }
    function display(){
        var currNode = this.head;
        while(!(currNode.next==null)){
            console.log(currNode.next.element);  //當前下一個節(jié)點中保存的數(shù)據(jù)current.next.element
            currNode = currNode.next;
        }
    }

    //測試程序
    var cities = new LList();
    cities.insert('徐州','head');
    cities.insert('蘇州','徐州');
    cities.insert('南京','蘇州');
    cities.insert('無錫','南京');
    cities.display()
    console.log(cities.find('蘇州'))
    cities.remove('蘇州');
    cities.display();
    console.log(cities.find('head'))

此時輸出的結(jié)果是:

clipboard.png

但是如果我把remove()方法里面的prevNode.next = prevNode.next.next;
改成prevNode.next = item.next;結(jié)果就變成下圖所示

clipboard.png

回答
編輯回答
怣人

看了下你貼的代碼,是你把此item和彼item理解混了

  function remove(item){
        var prevNode = this.findPrevious(item);
        if(!(prevNode.next==null)){
            prevNode.next = prevNode.next.next;   //###########這一句是有疑惑的地方
        }
    }

這里的item其實應(yīng)該是itemName

  function remove(itemName){
        var prevNode = this.findPrevious(itemName);
        if(!(prevNode.next==null)){
            prevNode.next = prevNode.next.next;   //###########這一句是有疑惑的地方
        }
    }

所以按你的方法應(yīng)該這樣寫

function remove(itemName){
        var item = this.find(itemName);
        var prevNode = this.findPrevious(itemName);
        if(!(prevNode.next==null)){
            prevNode.next = item.next;   //###########這一句是有疑惑的地方
        }
    }
2018年2月7日 03:47