我先写了一个循环链表的类,这是没错误的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;
}
}
}陷入了死循环啊,帮忙改一下,让他能成功,我调试了半天了
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;
}
}
}陷入了死循环啊,帮忙改一下,让他能成功,我调试了半天了
解决方案 »
- 全角制表符为何显示为半角的宽度?
- 求教整数转换问题
- 在线求救!!!! 关于解析XML文件时遇到编码错误的问题
- 如何实现java中英文混合字符截取
- 请问,在java中可以用什么方法来监测网络流量,并且得到每秒的流量大小?
- 我可以访问任何的网站,就是访问不了www.sun.com,而且我能访问www.sun.com.cn。
- 请教:如何让执行耗时的操作的同时显示一个动画?
- Java class 问题
- 我是做Java的,我遇到了两个数学问题
- 情况紧急!立马给分!编译时出现“使用或覆盖一个不鼓励使用的API”是怎么回事?
- 关于BASE64Decoder加密的问题,高手进。。。。
- struts 动态Action问题
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);
}
}