在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

正如标题所暗示的,我试图用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); 

    }

    }   
以下是显示我遇到的问题的方法: (注意:我创建此方法只是为了显示我理解中的问题,对链表没有任何作用)

该函数的输出给出以下结果

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变量做一些事情,但我无法清楚地表达或理解到底发生了什么。再次感谢你!