【问题标题】: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; 的事情吗?

【问题讨论】:

    标签: java nodes next


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答!我想我明白了。 first 将在任何引用它的内容被修改时更改;否则,我必须更新它才能发生更改。
    猜你喜欢
    • 2020-09-10
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多