单向循环链表
双向循环链表
仿真链表
一、单向循环链表:
1、概念:
单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环。
和单链表相比,循环单链表的长处是从链尾到链头比较方便。当要处理的数据元素序列具有环型结构特点时,适合于采用循环单链表。
和单链表相同,循环单链表也有带头结点结构和不带头结点结构两种,带头结点的循环单链表实现插入和删除操作时,算法实现较为方便。
带头结点的循环单链表的操作实现方法和带头结点的单链表的操作实现方法类同,差别仅在于:
(1)在构造函数中,要加一条head.next = head 语句,把初始时的带头结点的循环单链表设计成上图中(a)所示的状态。
(2)在index(i)成员函数中,把循环结束判断条件current != null改为current != head。
2、单链表的代码实现:
先回顾上一篇文章,定位到第三段“三、单项链表的代码实现”,我们是需要修改这段里面的(3)LinkList.java代码,(1)和(2)的代码不变。
(3)LinkList.java:单项循环链表类:(核心代码)
1 //单向循环链表类
2 public class CycleLinkList implementsList {3
4 Node head; //头指针
5 Node current;//当前结点对象
6 int size;//结点个数7
8 //初始化一个空链表
9 publicCycleLinkList()10 {11 //初始化头结点,让头指针指向头结点。并且让当前结点对象等于头结点。
12 this.head = current = new Node(null);13 this.size =0;//单向链表,初始长度为零。
14 this.head.next = this.head;15 }16
17 //定位函数,实现当前操作对象的前一个结点,也就是让当前结点对象定位到要操作结点的前一个结点。18 //比如我们要在a2这个节点之前进行插入操作,那就先要把当前节点对象定位到a1这个节点,然后修改a1节点的指针域
19 public void index(int index) throwsException20 {21 if(index size -1)22 {23 throw new Exception("参数错误!");24 }25 //说明在头结点之后操作。
26 if(index==-1) //因为第一个数据元素结点的下标是0,那么头结点的下标自然就是-1了。
27 return;28 current =head.next;29 int j=0;//循环变量
30 while(current != head&&j
36 }37
38 @Override39 public void delete(int index) throwsException {40 //TODO Auto-generated method stub41 //判断链表是否为空
42 if(isEmpty())43 {44 throw new Exception("链表为空,无法删除!");45 }46 if(index <0 ||index >size)47 {48 throw new Exception("参数错误!");49 }50 index(index-1);//定位到要操作结点的前一个结点对象。
51 current.setNext(current.next.next);52 size--;53 }54
55