[英]How do assignments work in enqueue operation in Java linked list implementation
[英]How do pointers work in a linked list (Java)
/**
* Definition for polynomial singly-linked list.
* class PolyNode {
* int coefficient, power;
* PolyNode next = null;
* PolyNode() {}
* PolyNode(int x, int y) { this.coefficient = x; this.power = y; }
* PolyNode(int x, int y, PolyNode next) { this.coefficient = x; this.power = y; this.next = next; }
* }
*/
PolyNode iter1 = poly1;
PolyNode poly1 = null;
while(iter1 != null){
PolyNode next = iter1.next;
iter1.next = poly1;
poly1 = iter1;
iter1 = next;
}
我对上面的 while 循环很困惑。 我不知道这个 while 循环将如何处理链表 poly1。 请帮帮我!
在 while 循环中,第一行创建了“iter1.next”的副本。 第二行使“iter1”指向“poly1”。 第三行让'poly1'变成'iter1'。 第 4 行让 iter1 成为“下一个”。
请纠正我错误的地方,因为我试图从上面的逻辑中绘制图表。 这对我来说不太有意义。
它不复制任何东西,它分配参考。 所有语句都按顺序执行。 赋值运算符将右侧的值赋给左侧的变量。 (这不是数学中的等价关系)。
PolyNode next = iter1.next;
将当前节点的下一个节点的引用存储到变量next
中。iter1.next = poly1;
更新对当前节点的下一个节点的引用,以引用与引用poly1
当前相同的 object 实例。 请注意, poly1
以null
作为值开头。poly1 = iter1;
更新poly1
引用以引用与iter1
引用相同的 object 实例。iter1 = next;
更新iter1
引用以引用与next
引用相同的 object 实例(旧的iter1.next
引用,在它更改为poly1
之前)。我将尝试将步骤绘制为美丽的 ASCII 艺术:
我们将从一个包含 3 个节点的简单链表开始(即A.next == B; B.next == C; C.next == null;
)。 我们从引用第一个节点的iter1
和引用“无”的poly1
开始(即null
):
A->B->C->null
^------------ iter1
^--- poly1 (of course, this there isn't any single null)
PolyNode next = iter1.next;
A->B->C->null ^------------ iter1 ^--------- next == iter1.next
iter1.next = poly1;
A->null | B->C->null ^------------------- iter1 ^---------------- iter1.next == poly1 (== null) ^--------- next
poly1 = iter1;
A->null | B->C->null ^------------------- iter1 == poly1 ^---------------- iter1.next == poly1 (== null) ^--------- next
iter1 = next;
A->null | B->C->null ^------------------- poly1 ^--------- next == iter1 ^------ iter1.next
while 循环的下一次迭代( iter1 != null
):
PolyNode next = iter1.next;
A->null | B->C->null ^------------------- poly1 ^--------- iter1 ^------ iter1.next == next
iter1.next = poly1;
B->A->null | C->null ^------------------- iter1 ^---------------- poly1 == iter1.next ^------ next
poly1 = iter1;
B->A->null | C->null ^------------------- iter1 == poly1 ^---------------- iter1.next ^------ next
iter1 = next;
B->A->null | C->null ^------------------- poly1 ^------ next == iter1
while 循环的下一次迭代( iter1 != null
):
PolyNode next = iter1.next;
B->A->null | C->null ^------------------- poly1 ^------ iter1 ^--- iter1.next == next
iter1.next = poly1;
C->B->A->null ^------------ iter1 ^--------- poly1 == iter1.next ^--- next
poly1 = iter1;
C->B->A->null ^------------ iter1 == poly1 ^--------- iter1.next ^--- next
iter1 = next;
C->B->A->null ^------------ poly1 ^--- next == iter1
iter1 != null
现在为假,循环终止。 您的 function 通过将所有节点添加到新列表来有效地反转链表; 我希望它的名字是reverse()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.