(学习java)用java语言构造的循环链表解决约瑟夫问题

来源:互联网 发布:托福阅读做题步骤 知乎 编辑:程序博客网 时间:2024/06/01 09:21
//josephus问题 41个人1-3报数,数到3的自杀,最后剩余的2个人结点数据public class Josephus {public static void main(String[] args) {SLineList s = new SLineList();//定义人数mint m = 41;s.init();//建立一个有m个结点的循环链表for(int i=1;i<=m;i++){s.addNode(i);}s.josephus(3);s.list();}//定义结点类public static class Node{public int data;public Node next;public Node(){}public Node(int data){this.data = data;this.next = null;}}public static  class SLineList{//定义头结点private Node head;//定义尾结点private Node rear;//定义链表长度private int size;public void init(){head = new Node();rear = new Node();head.next = rear;rear.next = head;size = 0;}//添加结点(尾插法)public void addNode(int data){Node node = new Node(data);if(head.next == rear){node.next = rear;head.next = node;size++;}else{Node temp = head;while(temp.next != rear){temp = temp.next;}node.next = rear;temp.next = node;size++;}}//循环链表的遍历public void list(){if(head.next == rear){System.out.println("空链表");System.out.println("链表的长度" + size);}else if(head.next.next == rear){System.out.println(head.next.data);System.out.println("链表的长度" + size);}else{Node temp = head;while(temp.next.next != rear){temp = temp.next;System.out.print(temp.data + "->");}temp = temp.next;System.out.println(temp.data);System.out.println("链表的长度" + size);}}//josephus问题 41个人1-3报数,数到3的自杀,最后剩余的2个人结点数据public void josephus(int n){int s = n-1;Node p = head;while(size != s){for(int i=0;i<s;i++){p = p.next;if(p == rear){p = p.next.next;}else if( p == head){p = p.next;}}if(p.next == rear){p = p.next.next;Node temp = p.next;p.next = p.next.next;temp = null;size--;}else if(p == head){p = p.next;Node temp = p.next;p.next = p.next.next;temp = null;size--;}else if(p == rear){p = p.next.next;Node temp = p.next;p.next = p.next.next;temp = null;size--;}else{Node temp = p.next;p.next = p.next.next;temp = null;size--;}}}}}

原创粉丝点击