Java中混乱的语法

Java中混乱的语法,java,syntax,constructor,linked-list,simplify,Java,Syntax,Constructor,Linked List,Simplify,我有一段代码,我正在努力理解。代码片段本身是双链表的构造函数,这很好;但是,最后一行是:(head=head.next);这可能会从数组a中删除用于添加节点的临时节点。但是它是如何工作的呢?如果有人能把它分解成清晰、独立的行,那将非常有帮助。 以下是构造函数: // standard constructor public DoublyLinkedList() { head = tail = null; numElements = 0; changes = 0; } //

我有一段代码,我正在努力理解。代码片段本身是双链表的构造函数,这很好;但是,最后一行是:(head=head.next);这可能会从数组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
}
//标准构造函数
公共双链接列表(){
头=尾=空;
数值=0;
变化=0;
}
//建造师
公共双链接列表(T[]a){
this();//调用标准构造函数
requirennull(a,“a为空!”);
head=tail=newnode(null);//临时节点
对于(T值:a){
if(值!=null){
tail=tail.next=new节点(value,tail,null);//后面是新节点
numElements++;
}
}
//删除临时节点
如果(numElements==0)head=tail=null;
else(head=head.next).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
在那里不起作用,因为它没有设置在循环中。

这是逻辑问题还是语法问题?你到底不明白什么?@shmosel我想这更多是一个语法问题,谢谢你的评论。虽然这个代码片段可能是解决方案,包括一个解释确实有助于提高你文章的质量。请记住,您将在将来回答读者的问题,而这些人可能不知道您的代码建议的原因
System.out.println((4 + 2) / 2);