关于遍历、插入、删除节点的问题

Posted

技术标签:

【中文标题】关于遍历、插入、删除节点的问题【英文标题】:Questions about traversing, inserting, and deleting nodes 【发布时间】:2017-06-22 23:25:22 【问题描述】:

刚开始学习节点,我有几个问题。假设我有一个如下所示的节点类:

    private E number;
    private Node next;
    /**
     *  Constructor
     */
    Node(E e)
       number = e;
       next = null;
    

我有一系列链接节点,起始节点首先命名如下:

第一->(1)->(2)->(3)->(5)->(6)

假设列表不为空,要遍历列表,我会这样做:

Node curr = first;
while(curr != null)
    System.out.print(curr);
    curr = curr.next;

我知道您不能向后遍历这样的链接列表,这是否意味着每当我调用 curr.next 之前的元素都会丢失?

我还想知道首先,我的原始列表是否会受到像 curr 这样的临时节点列表的影响?例如,如果我要在列表中插入或删除一个节点,其代码类似于以下:

插入:

Node curr = first;
Node newNode = new Node(4);
while(curr != null)
    if(curr.number == 3)
        newNode.next = curr.next;
        curr.next = newNode;
    
    curr = curr.next;

删除:

Node curr = first;
Node parent = first;
while(curr != null)
    if(curr.number == 3)
        parent.next = curr.next;
    
    parent = curr;
    curr = curr.next;

上面的代码是先修改还是我必须在插入或删除之后设置first = curr;才能进行更改?如果他们先修改,curr = curr.next; 怎么不先修改?如果我想返回已删除的节点怎么办?我会先做类似curr.next = null; 然后return curr; 的事情吗?

【问题讨论】:

【参考方案1】:

这是否意味着每当我调用 curr.next 之前的元素都会丢失?

当您遍历列表时,您从未修改过first,也从未修改过任何Nodenext 链接。因此,没有一个节点会真正丢失。以前访问过的节点只是变得不那么方便访问了,因为它们没有“句柄”,但是您总是可以通过从列表的开头(first)开始并按照@987654325再次找到它们@链接。

我还想知道首先,我的原始列表是否会受到像 curr 这样的临时节点列表的影响?

变量first 永远不会受到除first 左侧有first 的赋值语句之外的任何东西@ 的影响。另一方面,first 所指的列表可能会发生很大变化或完全不受影响,具体取决于您使用curr 的目的,但first 本身只能通过为@987654332 分配新值来影响@。

上面的代码是先修改还是先设置=curr;

给定的插入和删除代码永远不会修改first。但它应该,如果它能够处理在当前第一个节点之前插入一个新节点,或者删除当前第一个节点。也许不是专门针对first = curr,但first 肯定需要更新以反映列表的新负责人。正如教科书所说,我将其保留为“作为读者的练习”。

【讨论】:

感谢您的回答!我想我明白了。 first 将在任何引用它的内容被修改时更改;否则,我必须更新它才能发生更改。

以上是关于关于遍历、插入、删除节点的问题的主要内容,如果未能解决你的问题,请参考以下文章

二叉查找树中元素的删除操作

链表_有序链表(插入删除遍历)

JavaScript之jQuery-3 jQuery操作DOM(查询样式操作遍历节点创建插入删除替换复制)

堆(插入删除)

JavaScript单向链表的创建遍历插入删除操作

同时创建两条单链表,头插法插入节点,遍历,查找,删除,求长度,冒泡排序,反转,2条有序链表链接成一条链表后依然有序