正如标题所暗示的那样,我试图在java中实现一个双向链表。
然而,在处理它时,我遇到了一些我难以理解的东西。
对于上下文,这是我的代码:
public class Doublelist{
Node head;
public static class Node{
private int data;
private Node prev;
private Node next = null;
public Node (int data){
this.data = data;
prev = null;
next = null; //default case for new node
}
public String toString(){
String i = Integer.toString(data);
return i;
}
//Method below handles inputting data at end of the linked list
public static Doublelist add_node_end(Doublelist list, int data){
Node add_node = new Node(data);
add_node.next = null;
if (list.head == null){
list.head = add_node;
list.head.prev = null;
}
else{
Node travel = list.head;
while (travel.next != null){
travel = travel.next;
}
add_node.prev = travel;
travel.next = add_node;
}
return list;
}
public static void modify_obj_test (Doublelist list){
Node travel = list.head;
System.out.println("Travel initially: "+ travel);
Node currnode = travel;
travel.next.next = null;
System.out.println("Travel.next.next: "+ travel.next.next);
System.out.println("Currnode.next.next: "+ currnode.next.next);
}
}
这是显示我遇到的问题的方法:(注意:我创建这个方法只是为了显示我理解中的麻烦,对链表没有任何作用(
public static void modify_obj_test (Doublelist list){
Node travel = list.head;
System.out.println("Travel initially: "+ travel);
Node currnode = travel;
travel.next.next = null;
System.out.println("Travel.next.next: "+ travel.next.next);
System.out.println("Currnode.next.next: "+ currnode.next.next);
}
其输出给出以下内容
Travel initially: 1
Travel.next.next: null
Currnode.next.next: null
但是,当我更改此功能并执行以下操作时
public static void modify_obj_test (Doublelist list){
Node travel = list.head;
System.out.println("Travel initially: "+ travel);
Node currnode = travel;
travel = travel.next;
travel = travel.next;
travel = null;
System.out.println("Travel.next.next: "+ travel);
System.out.println("Currnode.next.next: "+ currnode.next.next);
}
然后输出变为
Travel initially: 1
Travel.next.next: null
Currnode.next.next: 3
我的问题是,为什么当我使 travel.next.next = null 时 currnode.next.next 被修改,但是当我通过执行 travel = travel.next 逐个向下移动列表时, 它不会影响currnode变量?
我认为通过使 currnode = travel,有点像在 C 中创建一个临时变量,其中值的副本在操作进行时保持安全,我没有意识到取决于我如何修改旅行变量它也会影响 currnode 变量。
为什么当我进行 travel.next.next = null 时,currnode.next.next 被修改
了
如果您引用的是第一组代码,currnode
指向与travel
相同的列表(list.head
(,并且由于您将travel.next.next
设置为 null,因此currnode.next.next
也是 null(因为它们都指向同一个列表(。
travel.next.next = null;
上面的行更改了列表中的数据。
但是当我通过旅行逐个移动列表时= travel.next,它不会影响currnode变量?
在第二组代码中,您没有将travel.next.next
设置为 null。 您正在travel
设置为 null。 因此,travel
不再指向任何内容,并且您没有修改任何列表。
travel = travel.next; // Move 'travel' to the next node
travel = travel.next; // Move 'travel' to the next node
travel = null; // Set 'travel' so that it is pointing to nothing
上述行都不会更改列表中的数据。