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
在那里不起作用,因为它没有在循环中设置。
我有一段代码很难理解。代码片段本身是双向链表的构造函数,这很好;然而,最后一行说:
(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
在那里不起作用,因为它没有在循环中设置。