循环链表
将单链表中的终端节点的指针端由空指针改为指向头结点,就使得整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表
实现注意点
- 在单链表的基础上,修改最后的指向改为头结点,
1.1 即a.next=b
1.2 next=c.next
1.3 …
1.4 n.next=a - 循环判断,原来判断是
n.next==null
表示尾节点, 改为n.next ! = a
实现
在链式存储结构(单链表)实现 的基础上,其实只要稍作修改即可
- 尾插法初始化更新,重点在最后一句
p.nextNode=null
改为p.nextNode=rootNode;
// String data = "31,21,17,16";
public void lastInit(String[] data){
//头节点空数据
rootNode.data = null;
Node p = rootNode;
for (String datum : data) {
Node n = new Node();
n.data = Integer.parseInt(datum);
p.nextNode=n;
p=n;
}
//循环链表
p.nextNode=rootNode;
}
因为是尾插法,所以数据按照顺序31.21.17.16,重点在最后一个16节点指向了data为null的头结点
2. 头插法初始化更新,重点在第二句rootNode.nextNode=null;
改为rootNode.nextNode=rootNode;
// String data = "31,21,17,16";
public void headInit(String [] data){
rootNode.data = null;
rootNode.nextNode=rootNode;
for (String datum : data) {
Node n = new Node();
n.data = Integer.parseInt(datum);
n.nextNode = rootNode.nextNode;
rootNode.nextNode = n;
}
}
头插法,第一个的31依次被插队,故顺序为倒序,即16,17,21,31.** 重点在31节点始终指向第一个节点** ,初始化就是,一直被"插队",好可怜
- 输出循环判断
p.nextNode!= null
改为p.nextNode!= rootNode
public void out(String str){
System.out.print(str+" ");
Node p = rootNode;
while ( p.nextNode!= rootNode) {
System.out.print (p.nextNode.data+",");
p = p.nextNode;
}
System.out.println();
}
- 其他
插入和删除则不用管也行,因为有k限制,不会导致死循环,当然最好还是改一点,
while (p.nextNode!=null&&k < index)
//改为
while (p.nextNode!=rootNode&&k < index) {
收获
一开始比较懵,细细品读文章和两个关键点,即可稍微修改实现.在单链表基础上实现并没有那么复杂