前言
线性表的链式存储是用若干地址分散的存储单元存储数据元素,逻辑上相连的数据元素在物理位置上不一定相连,必须采用附加信息表示数据元素之间的关系,并且存储单元至少包含两部分-数据域和地址域
单链表
单链表中结点只有一个地址并且指向后继结点
单链表结点类Node声明如下
由于java不支持指针类型,但提供引用方式保存包括地址在内的结构化信息
通常通过node结点建立两个结点之间的链接,如p结点的下一个结点是q结点
Node
p=new Node (‘A’,null);
Nodeq=new Node (‘B’,null);
p.next=q;
单链表的头指针head也是一个结点引用
Node
head=null;
当head==null时,为空单链表
单链表的遍历操作
遍历单链表是指从第一个结点开始,沿着结点的next链,依次访问单链表中的每个结点,并且每个结点只访问一次
Node
p=head;
while(p!=null){
p=p.next;
}
单链表的插入操作
对单链表进行插入操作,只要该表节点间的链接关系,不需要移动数据元素
空表插入/头插入
if(head==null)
head=new Node(x,null); //空表插入
else{
Nodeq=new Node (x,null); //头插入
q.next=head;
}
中间插入
若p指向非空单链表的某个结点,在p结点之后插入q结点
< Node
q.next=p.next; //q的后继结点应是p的原后继结点
p.next=q; //q作为p的后继结点
尾插入
单链表的删除操作
删除单链表的指定结点,只需改变结点的next域
头删除
head=head.next;
中间/尾删除
if(p.next!=null)
p.next=p.next.next;
单链表实现类
|
|
单链表求解约瑟夫环
只需更改一处
//LList
list=new seqList (number);
LListlist=new SinglyLinkenList ();
得到如下结果
初始化约瑟夫环:(5,0,2)
删除B(A,C,D,E)
删除D(A,C,E)
删除A(C,E)
删除E(C)
最后的被赦免者是:C
此外单链表相比较于顺序表在插入和删除时只要改变少量结点的链,不需要移动数据元素,也避免了顺序表因存在空间不足扩充空间和复制元素的过程,提高了运行效率和空间利用率