【问题标题】:Why does manipulating LinkedList node alias allow this method to work?为什么操作 LinkedList 节点别名允许此方法工作?
【发布时间】:2019-09-30 20:48:42
【问题描述】:

我不明白为什么下面的方法有效。顾名思义,它删除了链接列表中的所有空值,列表的前面称为head。我知道head 变量的别名是用Node<E> current = head 创建的,但我不知道这种方法如何设法维护原始的 head 变量。从外观上看,每次迭代(current = current.next 或current.next = current.next.next)都会使电流变得越来越小,但不知何故,当打印出链接列表时,一个完整且准确的head 变量仍然存在。我敢肯定这个答案一定很简单,但它让我难以理解。

public void remove_nulls() {
    while (head!=null && head.data==null) {
        removeFirst();
    }
    if (head==null) {
        return;
    }
    // List is non-empty and does not start with a null item
    Node<E> current=head;
    while (current.next!=null) {
        if (current.next.data==null) {
            current.next=current.next.next;
            size--;
        } else {
            current = current.next;

        }
    }
}

【问题讨论】:

  • 需要更多关于 head 变量的信息。是否维护深层副本?
  • @YogeshKaushik 不,我不这么认为。

标签: java list linked-list


【解决方案1】:

我知道 head 变量的别名是用 Node&lt;E&gt; current = head

此语句不正确,因为current 不是“别名”,它是指向与head 相同地址的新引用。因此,当您重新分配 current = current.next 时,head 引用不会改变,它仍将指向它所指向的地址,而 current 将指向下一个元素。

换句话说,如果列表的第一个元素不是null,则head 引用将不会更改,并且在方法完成时仍将指向同一个元素。此行删除了所有其他 null 元素:current.next = current.next.next;:

【讨论】:

  • 那么,head 变量是如何被修改的呢?此方法完成后,这些更改将反映在列表中。
  • @TheFiveHundredYears 你的意思是如何修改列表的头部元素?我认为它发生在removeFirst() 方法中。
  • 只有第一个元素的数据为空时才会执行
  • @TheFiveHundredYears 正确,如果第一个元素的数据不为空,不应该修改,对吧?
  • 不,该方法会删除所有空值,因此将删除一个为空的中间元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2020-06-04
相关资源
最近更新 更多