详解p=q->next和p->next=q的区别,附代码

  • Post author:
  • Post category:其他

单链表简单操作

先说明我的理解。文章后面,会有代码验证

(1)p=q

在这里插入图片描述

这里相当于给一个名叫q的内存空间起了一个别名叫做p。p和q的hashcode相同,所以p和q实际上是同一个对象。

举个例子:你有一本叫做《q》,你不方便使用它的原名。你就想给它起个别名p。

  1. 首先你需要将p定义为书名的即格式《p》 node p = null;
  2. 接着在给那本书起别名。p = q

(2)p.next = q

在这里插入图片描述

将q赋值给p.next。也就是说p的next中保存的会是q。那么p的下一个节点为q同时p与t的连接断开了

(3)p=q.next

在这里插入图片描述

理解为q.next(t)赋值给p,也就是将t赋值给p。这里相当于给一个名叫t的内存空间起了一个别名叫做p。p和t的hashcode相同,所以p和t实际上是同一个对象,只不过这个对象有两个名字。

###下面我将给出代码说明,为便于理解和证明为Node添加name属性

Node类

public class Node {
    public String name;
    public int value;
    public Node next;
    public Node(){
    }
    public Node(int data){
        this.value = data;
    }
    public Node(String name){
        this.name = name;
    }
    public Node(String name,int data){
        this.name = name;
        this.value = data;
    }
    
}

输出类Print

public class Print {
    public static void printLinkedList(Node node) {
        System.out.print("Linked List: ");
        while (node != null) {
            System.out.print(node.name + ":"+ node.value + "->");
            node = node.next;
        }
        System.out.println();
    }

}

测试类

public class Test {
    public static void main(String[] args) {
        Print print = new Print();
        Node node1 = new Node("node1",1);
        Node node2 = new Node("node2",2);
        Node node3 = new Node("node3",3);
        Node node4 = new Node("node4",4);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = null;

        //(1)未作修改
        //print.printLinkedList(node1);

        //(2)测试 p = q    node = node2
        //Node node = new Node("node");
        //node = node2;
        //System.out.println(node.hashCode());
        //System.out.println(node2.hashCode());
        //System.out.println(node == node2);
        //print.printLinkedList(node1);
        //print.printLinkedList(node);

        //(3)测试p.next = q  node2.next = node
        //Node node = new Node("node",22);
        //node2.next = node;
        //System.out.println(node.hashCode());
        //System.out.println(node2.next.hashCode());
        //System.out.println(node3.hashCode());
        //print.printLinkedList(node1);

        //(4)测试p=q.next  node = node2.next
        Node node = new Node("node",22);
        node = node2.next;
        System.out.println(node.hashCode());
        System.out.println(node2.next.hashCode());
        System.out.println(node == node3);
        print.printLinkedList(node1);
        print.printLinkedList(node);

    }
}

运行结果

(1)

Linked List: node1:1->node2:2->node3:3->node4:4->

(2)node = node2;测试结果

460141958
460141958
true
Linked List: node1:1->node2:2->node3:3->node4:4->
Linked List: node2:2->node3:3->node4:4->

第二个是以node2开头,证实了是将node2赋值给node所以

name,value,next都相同

(3)node2.next = node;测试结果

charter2.Node@1b6d3586
charter2.Node@1b6d3586
charter2.Node@4554617c
Linked List: node1:1->node2:2->node:22->

这里node2之后是node2和node3的连接被断开了

(4)node = node2.next;测试结果

460141958
460141958
true
Linked List: node1:1->node2:2->node3:3->node4:4->
Linked List: node3:3->node4:4->

这里证实了将node2的下一个节点赋值给node所以node和node3的

name,value,next都相同。

延伸

1.理解node2.next = node; node.next = node3是在弄得node2和node3之间插入node节点

在这里插入图片描述

2.理解node.next = node3;node2.next = node; 是在弄得node2和node3之间插入node节点

在这里插入图片描述

3.p.next=q.next是删除q节点

在这里插入图片描述

验证

//插入节点1
//Node node = new Node(22);
//node2.next = node;
//node.next = node3;
//print.printLinkedList(node1);


//插入节点2
//Node node = new Node(22);
//node.next = node3;
//node2.next = node;
//print.printLinkedList(node1);

//删除节点
//node2.next = node3.next;
//print.printLinkedList(node1);

版权声明:本文为weixin_42988712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。