java给对象起别名|青训营日记

81 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 13天

最近写算法题的时候我在想,如果new一个对象就在地址空间里开辟了一块地方,be like

import java.util.ArrayList;
import java.util.List;
public class TEST {
    public static void main(String[] args) {
        List a = new ArrayList(); //args
    }
}

image.png

那么如果再new了一个对象b,b = a;并不是将b的地址中复制了a的所有信息,而是将b也作为指向a的地址空间的的一个引用,be like

import java.util.ArrayList;
import java.util.List;
public class TEST {
    public static void main(String[] args) {
        List a = new ArrayList();
        List b = new ArrayList();
        a.add(1);
        b = a;
    }
}

image.png

如果a的值变化了,那么b是其引用也会跟着改变,be like

import java.util.ArrayList;
import java.util.List;
public class TEST {
    public static void main(String[] args) {
        List a = new ArrayList();
        List b = new ArrayList();
        a.add(1);
        b = a;
        a.add(2);
    }
}

image.png

但是如果a变成了其他地址的引用,那么b并不会改变,be like

import java.util.ArrayList;
import java.util.List;
public class TEST {
    public static void main(String[] args) {
        List a = new ArrayList();
        List b = new ArrayList();
        a.add(1);
        b = a;
        a = new ArrayList();
    }
}

image.png

  1. 填充每个节点的下一个右侧节点指针 queue队列取最前面的元素用,peek()如果无元素会返回null可以解决异常问题
/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/

class Solution {
    public Node connect(Node root) {
        if (root == null) return root;
        Queue<Node> queue= new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0;i < size;i++){
                Node temp = queue.poll();
                if (i == size-1) temp.next = null;
                else temp.next = queue.peek();
                if (temp.left != null) queue.offer(temp.left);
                if (temp.right != null) queue.offer(temp.right);
            }
        }
        return root;
    }
}