关于JS中的链表

发布于 2022-09-07 08:47:13 字数 2500 浏览 19 评论 0

最近在看数据结构与算法JavaScript描述,在链表这一章遇到了点问题,问题描述如下

要删除链表中的item节点,prevNode是item节点的前一个节点

书中用了 prevNode.next = prevNode.next.next; 来改变链表的指向。
但是我的理解是prevNode.next = item,然后试着利用prevNode.next = item.next删除链表,但是这时候的结果相当于就把链表断开了,只留下了prevNode和之前的节点。

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


感谢 改名字很伤神 的指正,以下是书中的代码

//Node类表示节点
    function Node(element){
        this.element = element;
        this.next = null;
    }
    //LinkedList类提供了插入节点、删除节点、显示列表元素的方法以及其他一些辅助方法
    function LList(){
        this.head = new Node("head");  //head节点的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);  //当前下一个节点中保存的数据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'))

此时输出的结果是:

clipboard.png

但是如果我把remove()方法里面的prevNode.next = prevNode.next.next;
改成prevNode.next = item.next;结果就变成下图所示

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小嗲 2022-09-14 08:47:13

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

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

这里的item其实应该是itemName

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

所以按你的方法应该这样写

function remove(itemName){
        var item = this.find(itemName);
        var prevNode = this.findPrevious(itemName);
        if(!(prevNode.next==null)){
            prevNode.next = item.next;   //###########这一句是有疑惑的地方
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文