在 Java 的链表中理解对象和修改它们的变量时遇到问题



正如标题所暗示的那样,我试图在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

上述行都不会更改列表中的数据。

相关内容

  • 没有找到相关文章

最新更新