Java数据结构与算法———(19)创建一个环形单向链表

创建一个环形单向链表,向其添加节点并输出。

一、代码
package linkedlist;

public class Josephu {

	public static void main(String[] args) {
		
		//构建一个单向环形链表并输出
		CircleSingleLinkedList circlesinglelinkedlist = new CircleSingleLinkedList();
		circlesinglelinkedlist.addBoy(5);
		circlesinglelinkedlist.showBoy();
	}

}

//创建一个环形的单向链表
class CircleSingleLinkedList{
	
	//创建一个 first 指针,用于指向环形单向链表的第一个节点
	private Boy first = null;// first 自始至终都只能指向环形单向链表的第一个节点,不能动 
	
	//1.  添加 Boy 节点的方法,构成一个环形单向链表
	public void addBoy(int nums) {//nums表示要创建的环形单向链表中节点的个数
		//(1)  先对 nums 做一个数据校验,因为个数至少得为1。如果1个都没有,那肯定不是环形单向链表了
		if(nums < 1) {
			System.out.println(" nums 的值不正确");
			return;//结束方法
		}
		//(2)  nums的值通过数据校验。由于节点个数已知为 nums ,因此使用 for 循环来创建环形单向链表
		Boy curBoy = null;//辅助指针(引用变量),帮助构建环形链表
		for(int i = 1; i <= nums; i++) {// i 从1而不是0开始,是为了更方便计数
			//根据编号,创建 Boy 节点(因此 i 要从 1 而不是 0 开始)
			Boy boy = new Boy(i);
			//如果创建的是第一个 Boy 节点
			if(i == 1) {
				first = boy;// first 是一个引用变量,不是节点(节点是对象)
				first.setNext(first);//构成环形单向链表,只不过此时只有一个节点
				curBoy = first;//让 curBoy 始终指向新添加的节点
			}else {//如果创建的不是第一个 Boy 节点
				curBoy.setNext(boy);
				boy.setNext(first);
				curBoy = boy;//让 curBoy 始终指向新添加的节点
			}
		}
	}
	
	//2.  遍历环形单向链表的方法(输出 Boy 节点的 no 值)
	public void showBoy() {
		//(1)  首先判断环形单向链表是否为空
		if(first == null) {// first 始终指向环形单向链表的第一个节点,不能动
			System.out.println("环形单向链表为空... ... ...");
			return;//结束方法
		}
		//(2)  环形单向链表不为空
		//由于 first 始终指向第一个节点,不能动,因此需要一个辅助指针(引用变量),帮助完成遍历
		Boy curBoy = first;// 辅助指针 curBoy 用于遍历,初始值为指向第一个节点
		while(true) {
			//<1>  先输出 no 值
			System.out.printf("小孩子的编号为 %d\n", curBoy.getNo());
			//<2>  再判断 curBoy 是否已经指向最后一个节点
			if(curBoy.getNext() == first) {
				break;
			}
			//<3>  curBoy没有指向最后一个节点,将 curBoy 后移,继续遍历
			curBoy = curBoy.getNext();
		}
	}
}

//创建一个Boy类,表示一个节点
class Boy{
	private int no;//编号
	private Boy next;//指向下一个节点,默认为null
	
	//构造方法
	public Boy(int no) {
		this.no = no;
	}
	
	//由于 no 和 next 都是用 private 修饰,所以要定义设置和获得 no 和 next 的方法
	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public Boy getNext() {
		return next;
	}

	public void setNext(Boy next) {
		this.next = next;
	}	
}
二、结果
小孩子的编号为 1
小孩子的编号为 2
小孩子的编号为 3
小孩子的编号为 4
小孩子的编号为 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值