Java 中令人困惑的语法

Confusing syntax in Java

我有一段代码很难理解。代码片段本身是双向链表的构造函数,这很好;然而,最后一行说:

(head = head.next).previous = null;

这应该会删除用于从数组 a 添加节点的临时节点。但是它是如何工作的呢?如果有人可以将其分解成清晰的、单独的行,那将非常有帮助。

这是构造函数:

// standard constructor
public DoublyLinkedList() {
    head = tail = null;
    numElements = 0;
    changes = 0;
}

// constructor
public DoublyLinkedList(T[] a) {
    this();  // call the standard constructor

    Objects.requireNonNull(a, "a is null!");

    head = tail = new Node<>(null);  // a temporary node

    for (T value : a) {
        if (value != null) {
            tail = tail.next = new Node<>(value, tail, null);  // new node at the back
            numElements++;
      }
    }

    // remove the temporary node
    if (numElements == 0) head = tail = null;
    else (head = head.next).previous = null; // the problematic bit
}
head = head.next;
head.previous = null;

它是这样的:

if (numElements == 0) {
     head = null;
     tail = null;
}
else {
    head = head.next;
    head.previous = null; // the problematic bit
}

人们不应该按照原来的方式来写,这会使代码混乱,正如您刚刚发现的那样。

让我试着为你分解一下。我假设您难以理解的代码部分如下:

else (head = head.next).previous = null; // the problematic bit

首先计算括号内的表达式,这意味着上面的代码基本上变成了下面的代码,正如我之前的其他人已经提到的那样。

head = head.next; // move onto the next node
head.previous = null;

如果您难以理解上述逻辑,请尝试 运行 下面的代码。在除法运算之前首先计算 4 + 2。

System.out.println((4 + 2) / 2);

第一次使用.next需要临时节点。它戴在头上。然后当不再需要它时,它会从头部移除。

代码中的问题 .previous 在那里不起作用,因为它没有在循环中设置。