特点

   循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。

链表的连接:

【例】在链表上实现将两个线性表(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("此链表不是循环链表。");
  }
 }
}

输出结果:


此链表为循环链表。



如果存在问题,我们随时交流!