在Java中,在链表中理解对象和修改对象变量时遇到困难
正如标题所暗示的,我试图用java实现一个双链表 然而,在工作中,我遇到了一些我难以理解的事情 以下是我的代码:在Java中,在链表中理解对象和修改对象变量时遇到困难,java,object,variables,linked-list,doubly-linked-list,Java,Object,Variables,Linked List,Doubly Linked List,正如标题所暗示的,我试图用java实现一个双链表 然而,在工作中,我遇到了一些我难以理解的事情 以下是我的代码: public class Doublelist{ Node head; public static class Node{ private int data; private Node prev; private Node next = null; public Node (int data
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);
}
}
以下是显示我遇到的问题的方法:
(注意:我创建此方法只是为了显示我理解中的问题,对链表没有任何作用)
该函数的输出给出以下结果
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: 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中设置一个临时变量,在C中,当操作进行时,值的副本保持安全。我没有意识到,根据我如何修改travel变量,它也会影响currnode变量
为什么在我设置travel.next.next=null时会修改currnode.next.next
如果您指的是第一组代码,currnode
指向与travel
(list.head
)相同的列表,并且由于您将travel.next.next
设置为null,currnode.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
以上任何一行都不会更改列表中的数据。非常感谢您的解释。当travel=travel.next而不是travel.next.next时,我知道正在对travel变量做一些事情,但我无法清楚地表达或理解到底发生了什么。再次感谢你!