图解数据结构———单双向循环链表基本算法即Joseph(约瑟夫环)。
1、单循环链表创建
图解
代码
链表节点
public class LoopSingleLinkListNode<E> {
E data;
LoopSingleLinkListNode next;
public LoopSingleLinkListNode() {
this.next = null;
}
public LoopSingleLinkListNode(E data) {
this.data = data;
this.next = null;
}
}
创建链表
public class LoopSingleLinkListClass<E> {
LoopSingleLinkListNode<E> header;
public LoopSingleLinkListClass() {
this.header = new LoopSingleLinkListNode<E>();
this.header.next = header;
}
}
1. 单循环链表头插入数据
图解
代码实现
public void add(E[] data){
LoopSingleLinkListNode<E> p = header,s;
for (int i = 0; i < data.length; i++) {
s= new LoopSingleLinkListNode<E>(data[i]);
p.next =s;
s.next = p;
p=s;
}
p.next = header;
}
2.Joseph约瑟夫环问题
图解
第一次循环
打印删除元素
第二次循环
打印删除元素
以此类推
代码实现
public void Josephs(LoopSingleLinkListClass<Integer> L,int m){
System.out.println("第二种方法");
LoopSingleLinkListNode p=L.header;
LoopSingleLinkListNode<Integer> p1 = new LoopSingleLinkListNode<>();
int i =L.getSize();
while (i!=0){
int j =1;
while (j<m){
if(L.getSize()==1) {
p =L.header.next;
break;
}
p=p.next;
j++;
}
System.out.print(p.next.data+" ");
System.out.println();
L.DeleteNode(p.next);
p = p.next;
i--;
}
}
双向循环链表
图解
双向循环链表插入数据
图解
代码实现
public void CreateList(E data[]){
LoopDoubleLinkListNode<E> p = header,s;
for (int i = 0; i < data.length; i++) {
s= new LoopDoubleLinkListNode<E>(data[i]);
s.next = p.next;
p.next =s;
s.pre = p;
p=s;
}
p.next = header;
header.pre =p;
}