1.链表概念
概念:单向链表就像一个铁链一样,元素之间相互连接,包含多个结点,每个结点有一个指向后继元素的next指针。表中最后一个元素的next指向null。如下图:
头结点:链表的结构导致了只要知道首结点就可遍历完整个链表的结点,因此此结点在链表中有很大的作用,称为头结点。
虚拟结点:由于头结点前没有任何结点,导致对链表进行任何增删改查时,都需要对头结点进行独立的一套增删改查操作。因此多设立一个虚拟结点,使其指针指向头结点,可以降低写代码的难度,虚拟结点中的值没有意义,一般不使用。
2.Java如何创建链表
用Java创建链表前,首先需要知道JVM如何创建链表,JVM内分为栈区与堆区。
栈区:存放函数的参数值、局部变量等,由编译器自动分配和释放,通常在函数执行完后就释放了,其操作方式类似于数据结构中的栈。栈内存分配运算内置于CPU的指令集,效率很高,但是分配的内存量有限。
堆区:就是通过new、malloc、realloc分配的内存块,编译器不会负责它们的释放工作,需要用程序区释放。我们创建的真正对象一般存在堆里,栈区一般存的是该对象的引用。
例如,当我们创建如下类:
public class People{
private People father;
private People mother;
}
father和mother就是指向堆的真实对象的引用,如果我们像下面方式创建:
public class Course{
private int val;
private Course next;
}
此时Course对象中的next值,就继续指向了一个新的Course对象。
这里通过栈中的引用(也就是地址)就可以找到val(1),然后val(1)结点又存了指向val(2)的地址,而val(3)又存了指向val(4)的地址,所以就构造出了一个链条访问结构。
3.Java定义与创建链表实例
Leetcode提供的java链表模板如下:
public class ListNode{
private int val;
private ListNode next;
ListNode(int x){
this.val = x;
this.next = null;
}
}
ListNode listNode = new ListNode(1);
虽然此模板没有提供对val值与next值对应的set与get方法,违反了面向对象设计的要求,但是大大提高了精简度,因此在单链表题目中被广泛使用。