链表
链表是使用一段任意的存储单元存储线性表(元素之间是一对一的关系,除了第一个和最后一个元素之外)元素的数据结构,链表有两个基本单元组成,由于是不刻意使用连续的存储空间存储元素,所以无法使用物理上的相邻来表示线性表的对应关系,所以就需要创建类结构Node,其中除了表示元素数据的字段之外还需要维护一个指向相邻元素的引用next。定义了Node之后,线性表的各元素可以通过next字段指向组成一条链,链表只需要一个提供一个指向这条链的链首或链尾的引用就可以访问这个线性表。所以单链表的实现首先需要定义一个Node类,然后在链表类list中提供创建链表的方法,提供指向链表的引用即可。以指向链表头为例,可以提供直接指向链表首节点的引用head,也可以添加一个附加头节点,头节点的next域指向首节点,提供一个指向头节点的引用head。
包含头节点和不含头节点
无论链表是否包含头节点,都需要一个引用head,添加了头节点的链表只是实现了操作的统一性,首先给出两种方式下的头插法实现。
1 /* 2 包含头节点的链表 3 */ 4 5 class list{ 6 Node head=new Node();//创建头节点,head是头节点的引用。head.next指向首节点 7 //头插法 8 public void addAtHead(Object obj){ 9 Node node=new Node(obj,head.next); 10 head.next=node; 11 } 12 } 13 14 15 /* 16 不包含头节点的链表 17 */ 18 19 class list2{ 20 Node head;//head是首节点的引用,head指向首节点 21 //头插法 22 public void addAtHead(Object obj){ 23 Node node=new Node(obj,head); 24 head=node; 25 } 26 }