环形链表实现和应用
package algorithm.linkedlist;
public class CircleSingleLinkedListDemo {
public static void main(String[] args) {
CircleSingleLinkedList list = new CircleSingleLinkedList();
list.createList(5);
list.show();
System.out.println("--------");
list.del(2);
list.show();
Node node = list.find(2);
System.out.println("node = " + node);
list.update(5);
list.show();
System.out.println("josephu-----------");
int n = 5;
int k = 2;
int count = 3;
josephu(n,k,count);
josephu(2,2,1);
}
private static void josephu(int n, int k, int count) {
if (n < 1 || k > n || count < 0 ) {
System.out.println("参数错误");
return;
}
CircleSingleLinkedList list = new CircleSingleLinkedList();
list.createList(n);
Node head = list.getHead();
Node tail = head;
while(tail.getNext() != head) {
tail = tail.getNext();
};
for (int i = 0; i < k -1; i++) {
head = head.getNext();
tail = tail.getNext();
}
while(head != tail) {
for (int i = 0; i < count-1; i++) {
head = head.getNext();
tail = tail.getNext();
}
System.out.println(head + "出局");
head = head.getNext();
tail.setNext(head);
}
System.out.println(head + "为幸运儿");
}
}
class CircleSingleLinkedList{
private Node head;
public Node getHead() {
return head;
}
public void setHead(Node head) {
this.head = head;
}
public void createList(int num) {
if (num < 1) {
System.out.println("参数错误");
return;
}
Node cur = head;
for (int i = 1; i <= num; i++) {
Node node = new Node(i, ""+i+i);
if (i == 1) {
head = node;
head.setNext(head);
cur = head;
}else {
cur.setNext(node);
cur = cur.getNext();
cur.setNext(head);
}
}
}
public void show() {
if (head.getNext() == null) {
System.out.println("空链表");
return;
}
Node temp = head;
while(true) {
System.out.println(temp);
if (temp.getNext() == head) {
break;
}
temp = temp.getNext();
}
}
public void del(int no) {
if (head.getNext() == null) {
System.out.println("空链表");
return;
}
Node temp = head;
boolean flag = false;
do{
if (temp.getNext().getNo() == no) {
flag = true;
break;
}
temp = temp.getNext();
}while(temp != head);
if (flag) {
if (temp.getNext() == head) {
head = temp.getNext().getNext();
}
temp.setNext(temp.getNext().getNext());
}else {
System.out.println("delete未找到");
}
}
public void update(int no) {
if (head.getNext() == null) {
System.out.println("空链表");
return;
}
Node cur = head;
boolean flag = false;
while(true) {
if (cur.getNo() == no) {
flag = true;
break;
}
if (cur.getNext() == head) {
break;
}
cur = cur.getNext();
}
if (flag) {
cur.setName("修改过");
}else {
System.out.println("update未找到");
}
}
public Node find(int no) {
if (head.getNext() == null) {
System.out.println("空链表");
return null;
}
Node cur = head;
while(true) {
if (cur.getNo() == no) {
return cur;
}
if (cur.getNext() == head) {
break;
}
cur = cur.getNext();
}
return null;
}
}
class Node{
private int no;
private String name;
private Node next;
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(int no,String name) {
this.no = no;
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Node [no=" + no + ", name=" + name + ", next= "+ next.getNo()+"]";
}
}