特点
循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。
链表的连接:
【例】在链表上实现将两个线性表(a1,a2,…,an)和(b1,b2,…,bm)连接成一个线性表(a1,…,an,b1,…bm)的运算。
分析:若在单链表或头指针表示的单循环表上做这种链接操作,都需要遍历第一个链表,找到结点an,然后将结点b1链到an的后面,其执行时间是O(n)。若在尾指针表示的单循环链表上实现,则只需修改指针,无须遍历,其执行时间是O(1)。
相应的算法如下:
LinkListConnect(LinkListA,LinkListB)
{//假设A,B为非空循环链表的尾指针
LinkList p = A.next;//①保存A表的头结点位置
A.next = B.next.next;//②B表的开始结点链接到A表尾
free(B.next);//③释放B表的头结点
B.next = p;
}
判断一个链表是否存在循环连接
编写两个java类,一个为Linkitem.java,另一个为测试类LinklistTest.java,分别如下:
//Linkitem.java
public class Linkitem {
Linkitem previous;
String data;
Linkitem next;
public Linkitem() {
}
public Linkitem(Linkitem previous, String data, Linkitem next) {
super();
this.previous = previous;
this.data = data;
this.next = next;
}
public Linkitem getPrevious() {
return previous;
}
public void setPrevious(Linkitem previous) {
this.previous = previous;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Linkitem getNext() {
return next;
}
public void setNext(Linkitem next) {
this.next = next;
}
}
*****************************************************
//LinklistTest.java
import java.util.ArrayList;
public class LinklistTest {
public static void main(String[] args) {
//初始化链表项
Linkitem a = new Linkitem(null, "a", null);
Linkitem b = new Linkitem(null, "b", null);
Linkitem c = new Linkitem(null, "c", null);
Linkitem d = new Linkitem(null, "d", null);
a.setPrevious(d);
a.setNext(b);
b.setPrevious(a);
b.setNext(c);
c.setPrevious(b);
c.setNext(d);
d.setPrevious(c);
d.setNext(a);
//新建存放链表的数组列表
ArrayList<Linkitem> list = new ArrayList<Linkitem>();
//添加个链表项
list.add(a);
list.add(b);
list.add(c);
list.add(d);
//是否为循环链表的判断变量
boolean link = false;
Linkitem start = a;
Linkitem current = a;
//判断循环链表
for (int i = 0; i < list.size(); i++) {
current = current.next;
if (start.data.equals(current.data)) {
link = true;
}
}
//输出
if (link == true) {
System.out.println("此链表为循环链表。");
} else {
System.out.println("此链表不是循环链表。");
}
}
}
输出结果:
此链表为循环链表。
如果存在问题,我们随时交流!
转载于:https://blog.51cto.com/zhaohaibo/1288753