图解数据结构———单双向循环链表基本算法即Joseph(约瑟夫环)。

174 阅读1分钟

图解数据结构———单双向循环链表基本算法即Joseph(约瑟夫环)。

1、单循环链表创建

图解

单向循环链表创建.png

代码

链表节点

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. 单循环链表头插入数据

图解

单向循环链表插入.png

代码实现
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约瑟夫环问题

图解

Joseph(约瑟夫环).png

第一次循环

删除1png.png

打印删除元素

删除1s.png 第二次循环

删除2.png

打印删除元素

删除2s.png

以此类推

最终.png

代码实现
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--;
    }
}

双向循环链表

图解

双向循环链表创建插入.png

双向循环链表插入数据

图解

双向循环链表头插法png.png

代码实现
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;
}