package com.zrp.link;
/**
* 节点类
* @author zrp
*
*/
class Node{
public Node(){}
public int data; //结点数据
public Node next; //指向下一结点的指针
Node(int data){
this.data = data;
}
/**
* 获取节点数据
* @param null
* @return int
*/
public int getNodeData(){
return this.data;
}
}
/**
* 报数链表类
* @author zrp
*
*/
public class NumberOffLink {
public Node headNode; //头结点
private int size; //链表长度
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
/**
* 构造函数,无参构造函数
* @param n,node
*/
public NumberOffLink(){
}
/**
* 有参构造函数,创建链表
* @param 人数account
*/
public NumberOffLink(int nodeCount){
if(nodeCount>=1){
headNode = new Node(1); //新建结点
Node p = headNode;
headNode.next = null;
for(int i=2;i<nodeCount;i++){
Node node = new Node(i);
p.next = node;
node=p;
}
this.size = nodeCount;
}
else{
System.out.println("输入的人数有误!");
}
}
/**
* 创建链表函数
*/
public Node creatLink(int nodeCount){
Node p;
if(nodeCount>=1){
Node head = new Node(1); //新建结点
p = head;
for(int i=2;i<=nodeCount;i++){
Node node = new Node(i);
p.next = node;
p=node;
}
this.size = nodeCount;
p.next = head; //把链表变成循环链表
return head;
}
else{
System.out.println("输入的人数有误!");
return null;
}
}
/**
* @param numberOffObj
* @return 返回报数后的表头结点
*/
public Node NumberOffMethod(Node head){
int currSize = this.getSize();
Node currNode = head;
Node tempNode=null;
Node tempMyHead = null;
Node delPreNode = null;
int tempSize = currSize;
for(int i=1;i<this.getSize();i++){ //趟数,每一次随着size的变化而不同
while(true){ //找出最后一个能被3整除的数
if(tempSize%3==0){
break;
}
tempSize--;
}
for(int j=1;j<=tempSize;j++){
if(j%3==0){
delPreNode.next = currNode.next;
System.out.println(currNode.data);
tempNode=currNode;
currNode = delPreNode;
this.size--;
//tempSize = j;
}
delPreNode = currNode;
currNode = currNode.next;
}//内循环
}//外循环
while(this.size!=0){
System.out.println(currNode.data); //打印剩余的数据
delPreNode = currNode;
delPreNode.next = currNode.next;
currNode = delPreNode;
currNode = currNode.next;
this.size--;
}
return tempNode;
}
/**
* 判断链表是否为空
*/
private boolean isLinkEmpty(Node head){
if(head == null){
return true;
}
else{
return false;
}
}
/**
* 测试函数
* @param args
*/
public static void main(String[] args) {
NumberOffLink link = new NumberOffLink();
Node head = link.creatLink(12);
Node tempH = link.NumberOffMethod(head);
}
}