加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 将LinkedList节点设置为null

发布时间:2020-12-15 04:31:05 所属栏目:Java 来源:网络整理
导读:我之前在编码书中遇到过这个问题. “给出一个算法来删除单链表中间的节点 只能访问该节点.“ 书中给出的解决方案是这样的: public static boolean deleteNode(LinkedListNode n) { if (n == null || n.next == null) { return false; // Failure } LinkedLi
我之前在编码书中遇到过这个问题.

“给出一个算法来删除单链表中间的节点
只能访问该节点.“

书中给出的解决方案是这样的:

public static boolean deleteNode(LinkedListNode n) {
    if (n == null || n.next == null) {
        return false; // Failure
    }
    LinkedListNode next = n.next;
    n.data = next.data;
    n.data = next.data;
    n.next = next.next;
    return true;
}

当然,这是一个很好的解决方案,是O(1).不过,这本书最后指出了这一点.

“请注意,如果要删除的节点是最后一个节点,则无法解决此问题
链表“.

我错过了一些明显的东西吗?为什么我不能只是在主体之前检查方法,检查n.next是否等于null,如果是,只需将n设置为null并返回true?有什么理由我不能这样做吗?

解决方法

这段代码真正做的是将下一个节点复制到给定节点.净效果就好像当前节点被删除一样,但实际上它只是被下一个节点覆盖了.

也就是说,你要删除此列表中的B:

A -> B -> C -> D

结果列表如下所示:

+------+
A -> B(Ccopy) ---+   C -+-> D

现在,您无法对节点D执行此操作,因为没有要复制的下一个节点.

Why couldn’t I just,say,put a check in the method before the body to check if n.next was equal to null,and if so,just set n to be null and return true? Is there any reason I can’t just do that?

将n设置为null将不会执行任何操作. n只是对要删除的列表节点的引用.如果更改n,则实际上不会更改列表中的任何内容.例如,假设您要在同一列表中删除D.它看起来像这样:

n
               |
               v
A -> B -> C -> D

如果将n设置为null,则最终结果如下:

n---> null


A -> B -> C -> D

请注意,列表中没有任何内容发生变化.

在这种情况下删除D的唯一方法是修改C.next指向null.也就是说,你想要这个:

+----> null
A -> B -> C --+ D

这需要修改C,但是在单链表中,你没有简单的方法从D访问C.你必须从列表的开头搜索,直到找到节点x,使x.next == D.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读