循环链表
- 图示
- 数据结构
-
循环链表添加新元素:
- 当链表中没有任何元素时候
-
当链表中已经存有至少一个元素的时候
- 当链表中没有任何元素时候
-
循环链表删除元素
-
链表元素>1
-
循环链表遍历元素
-
- ADT概要
-
//链表节点为单链表节点 private LinkNode currrent; //链表内节点个数 public int nItems; // 返回最早插入的元素 public LinkNode peek() ; //找出指定节点 public LinkNode find(int value); //添加新元素 在当前元素后插入新元素 public void insert(LinkNode node); //删除当前元素的下一个元素 public LinkNode remove(); //遍历显示当前循环链表 public void displayList();
-
/*单链表节点实现的有序循环链表*/ public class CircleList { private LinkNode current;//当前节点的指针 public int nItems;//链表内节点个数 public CircleList(){ current = null; } public LinkNode peek() { // 返回最早插入的元素 // 调用前要判断是否为空 return current.next; } public LinkNode find(int value) { LinkNode temp = current; // 保存原来的位置 do{ if(current.iData == value) return current; stepNext(); }while(current!=temp); throw new RuntimeException("不能找到该值 :"+value); } //添加新元素 public void insert(LinkNode node){ if(isEmpty()) { node.next = node; current = node;// 插入元素,current要移动要新元素 }else{ node.next = current.next; current.next = node; current = node;// 插入元素,current要移动要新元素 } nItems++; } //当前元素无法删除自身 只能删除当前元素的下一个元素 public LinkNode remove() { // list为空是没有考虑,在调用remove之前应该判断是否为空 if(isEmpty()){ throw new RuntimeException("链表当前为空 ,不能删除操作"); } LinkNode temp = current.next;// 删掉current的下一个元素 if (current.next == current) { // 只有一个元素时 current = null; } else { current.next = current.next.next; } nItems--; return temp; } public void displayList() { if(isEmpty()){ throw new RuntimeException("链表当前为空 ,不需要显示"); } LinkNode temp = current; do { // 从current stepNext(); current.displayLink(); } while (current != temp); System.out.println(); } /*指针移向下一处节点,返回指针指向的最新节点 */ public LinkNode stepNext(){ if(isEmpty()) throw new RuntimeException ("链表当前为空,指针不能移向下一个节点"); current = current.next; return current; } public int size() { return nItems; } public boolean isEmpty(){ return current== null; } public static void main(String[] args) { LinkNode node1 = new LinkNode(10,10.1); LinkNode node2 = new LinkNode(20,20.2); LinkNode node3 = new LinkNode(5,5.5); CircleList list = new CircleList(); list.insert(node1); list.insert(node2); list.insert(node3); System.out.println("Before delete"); list.displayList(); System.out.println("After delete"); list.remove(); list.displayList(); /*int target = list.find(20).iData; System.out.println("找到的值为"+target);*/ } }
-
- 循环链表的应用:
-
约瑟夫环:有7个人,从1到7,从第一个人开始报数,报到4出圆圈,最后被消去的人的顺序是4,1,6,5,7,3.最后剩下的人是2号.
-
1 初始化一个循环链表 2 循环遍历链表.每循环三个元素.删除下一个元素. 3 循环结束条件循环链表内只剩下唯一一个元素. 4 返回该元素
- 代码
-
public class JosephusRing { public static LinkNode getJosephus(int number){ CircleList circleList= new CircleList(); //Initialise the link list for (int i=1;i<=number;i++){ LinkNode node = new LinkNode(i,i+0.1); circleList.insert(node); } System.out.println("原始的圈子:"); circleList.displayList(); System.out.println("出圈子的顺序 :"); while(circleList.nItems!=1){ System.out.println("圈子中的人数 :"+circleList.nItems ); for(int j=1;j<4;j++) circleList.stepNext(); System.out.print(circleList.remove().iData + " "); } System.out.println(); return circleList.peek(); } public static void main(String[] args) { LinkNode number = JosephusRing.getJosephus(7); System.out.println("Josephus的编号是 :"+ number.iData); } }