我先写了一个循环链表的类,这是没错误的public class CycleList {

protected Node firstNode;




/**
 * 方法initiate初始化线性表
 *
 */
public void initiate() {
firstNode = null;
}





/**
 * 方法length无参数,返回线性表中元素的个数
 * @return
 */
public int length() {
Node current  = new Node();
current = firstNode;
if(firstNode == null) {
return 0;
}
int length = 1;
while(current.next != firstNode) {
current = current.next;
length++;
}
return length;
}


/**
 * 方法add输入一个参数int类型的data,将数值为data的元素添加到线性表的最后面
 * @param data
 */
public void add(int data,int key) {
Node newNode = new Node(data,key);
add(newNode);
}

public void add(Node newNode) {
if(firstNode == null) {
firstNode = newNode;
firstNode.next = firstNode;
}
Node current = new Node();
current = firstNode;
while(current.next != firstNode) {
current = current.next;
}
newNode.next = firstNode;
current.next = newNode;
}




/**
 * 方法get输入参数index,返回线性表中第index个元素的值
 * @param index
 */
public Integer get(int index) {
if(index > length() || index <= 0) {
return null;
}
Node current = new Node();
current = firstNode;
for(int i = 1;i < index;i++) {
current = current.next;
}
return new Integer(current.data);
}



/**
 * 方法traverse将线性表中的元素依次打印出来
 *
 */
public void traverse() {
if(firstNode == null) System.out.println("线性表中没有元素!");
Node current = new Node();
current = firstNode;
for(int i = 1;i <= length();i++) {
System.out.print(current.data + "," + current.key+ "\n");
current = current.next;


}
}





/**
 * 方法delete输入一个int类型的参数index,删除线性表中第index个元素
 * @param index
 */
public void delete(int index) {
Node prev = new Node();
Node current = firstNode;
if(index == 1 ){
for(int i = 1;i < length();i++) {
current = current.next;
}
firstNode = firstNode.next;
current.next =firstNode;
} try {
for(int i = 1;i < index;i++) {
if(current.next == firstNode) throw new NullPointerException("e");
prev = current;
current = current.next;
}
prev.next = current.next;
} catch (NullPointerException e) {
System.out.println("index超出了范围!");
}
}



/**
 * 方法locate输入一个int类型的参数data,返回线性表中元素的数值为data的元素的位置值。
 * 如果没有这个元素则,返回-1
 * @param data
 * @return
 */
public int locate(int data) {
Node current = firstNode;
int length = 1;
try {
while(current.data != data) {
current = current.next;
length++;
if(current.next == firstNode.next) throw new NullPointerException("e");
}
}
catch(NullPointerException e) {
return -1;
}
return length;
}

/**
 * 方法insert输入两个int类型的参数index和data,在线性表的第index个元素后面插入数值为
 *data的元素
 * @param index
 * @param data
 */
public void insert(int index,int data,int key) {
Node newNode = new Node(data,key);//用第一个构造方法构造出要插入的节点
Node current = firstNode;
Node prev = new Node();//定义遍历线性表元素时当前节点的前一个节点,用于插入处理时操作用
//分支一:要插入的地方超出了线性表的长度,调用add方法将它放在最后面,并打印出相关的信息提示用户
if(index > length()) {
System.out.println("输入的index数值超出了范围,已将其插入了最后面!");
add(newNode);
}
//分支二:插入的地方未超出范围,将它放在index之后一位
else {
for(int i = 1;i <= index;i++) {
prev = current;//记住当前节点的前一节点
current = current.next;//从第一个节点开始,向前遍历直到找到第index个元素
}
newNode.next = current;//将插入的节点指向第index个元素的后面的元素
prev.next = newNode;//将第index个元素指向插入的节点
}
}



/**
 * 方法isEmpty无参数,如果线性表为空返回true,否则返回false
 * @return
 */
public boolean isEmpty() {
if(firstNode == null) return true;
return false;
}


/**
 * 方法clear清空线性表
 *
 */
public void clear() {
firstNode = null;
}

}
class Node {
public int data;
public int key;
public Node next;


public Node() {
next = null;
}

public Node(int data,int key) {
this.data = data;
this.key = key;
}
}
我用它来实现解 约瑟夫环的问题 环是编号为1-7的人 密码分别为3,1,7,2,4,8,4
初始值是m = 6 所以它的出列顺序应是6 1 4 7 2 3 5
我的实现类是
public class TestCycleList {
public static void main(String[] args) {
CycleList ob = new CycleList();
ob.initiate();
ob.add(1, 3);
ob.add(2, 1);
ob.add(3, 7);
ob.add(4, 2);
ob.add(5, 4);
ob.add(6, 8);
ob.add(7, 4);
System.out.print(ob.length());
int m = 6;

Node current = ob.firstNode;
Node prev = new Node();
while(ob.isEmpty() == false) {


for(int i = 1;i < m;i++) {
prev = current;
current = current.next;
} System.out.print(current.data);
current.next = ob.firstNode;
prev.next = ob.firstNode;
m = current.key;
}

}
}陷入了死循环啊,帮忙改一下,让他能成功,我调试了半天了

解决方案 »

  1.   

    第二个改成这样的public class TestCycleList {
    public static void main(String[] args) {
    CycleList ob = new CycleList();
    ob.initiate();
    ob.add(1, 3);
    ob.add(2, 1);
    ob.add(3, 7);
    ob.add(4, 2);
    ob.add(5, 4);
    ob.add(6, 8);
    ob.add(7, 4);
    int m = 6;
    Node current = ob.firstNode;
    Node prev = new Node();
    while(current.next != current) {

    for(int i = 1;i < m;i++) {
    prev = current;
    current = current.next;
    }
    System.out.print(current.data);
    m = current.key;
    prev.next = current.next;
    current = current.next;
    //if(current.next == current) {current = null;}
    //prev.next = current;
    //current = current.next;
    //current.next = ob.firstNode;


    }
    System.out.print(current.data);

    }
    }