关于 “ head = null;”的疑问

来源:4-2 在链表中添加元素

JunboWang0731

2020-02-04

在LinkedList的构造方法中:

public LinkedList() {
	head = null;
	size = 0;
}

在这里,head是LinkedList类中的成员变量,并且head本身也是Node类的一个对象。
按照我的理解,head = null 是将head对象不指向任何对象。但是head对象和null是如何通过“=”实现这一目的的呢?

同样的困惑还来自于LinkedList的add方法:

public void add(int index, E e)
{
	...
	else{
		Node prev = head;
		for(int i = 0; i < index - 1; i++)
			prev = prev.next;
	}
	...
}

在这里寻找要插入元素的过程中,需要将prev替换为prev所指向的下一个Node对象,这里“=”将两个Node对象进行的是拷贝操作吗,那么拷贝的是“指针”还是什么东西?

本人没有Java基础,用了一些其他计算机语言中的“指针”概念,但这对我理解Java实现链表非常重要,请bobo老师见谅!

写回答

1回答

liuyubobobo

2020-02-05

简单的来说,在 Java 语言中,除了基本数据类型(byte、short、int、long、float、double、boolean、char),其他的数据类型(类对象),全部是指针,但是,在 Java 中叫引用。


所以,Node prev = head 的意思是,创建了一个 Node 类型的引用,这个引用指向的空间,和 head 指向的空间是一样的。


也就是我的 ppt 动画中的箭头,这些箭头指向真正存储数据的内存空间。真正存储数据的内存空间,必须靠 new 开辟。

//img.mukewang.com/szimg/5e39c26c096a59e418781030.jpg


所以,如果你有 C/C++ 基础的话,你说的对,prev = head; 背后拷贝的是指针的值,而不是 Node 数据的值。head 本身指向一个内存位置,prev = head 将 head 指向的那个内存位置,拷贝给 prev,让 prev 指向同一个内存为止。


至于 head = null,就是将 0 拷贝给 head(在 C/C++ 中,即是给指针赋 0 值)。因为 0 不是一个合法的可以存储数据的内存地址,所以编译器可以判断出,head 不指向任何位置。


继续加油!:)

1
2
liuyubobobo
回复
JunboWang0731
感谢分享:)
2020-02-06
共2条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程