List之LinkedList(假设20个人围成一个圈,从第一个人开始报数,每遇到3....)

对于LinkedList也实现了List接口,所以使用方法和ArrayList一模一样,底层实现是链表,链表分为双向和单向。
单向链表不再阐述下面给大家一个双向链表的草图:
在这里插入图片描述
如果你连链表是什么都不知道,那说明你要去补补数据结构了,本科生本专业来说一般都会学的,本人数据结构学的不好,所以后面可能也会更新一些关于这些的博客。但是最起码近几个月不会有这些内容,有需求的朋友建议自行搜集资料学习。
下面直接用一道题来让大家了解(这道题可以帮大家更好了解双向链表的结构)
假设有20个人围成一个圈,从第一个人开始报数,每遇到3这个人就淘汰,请问最后剩下的人是谁 要求使用链表结构来实现
请一定要注意看代码中的注释,虽然我基础比较差,注释打的不是很标准,不过还是足以说明代码的玄机的。

/**
 * 
 * @author Hercules
 * 
 * @version 创建时间:2020年1月8日 下午7:46:05
 * 
 * 20人围成一个圈经典题
 * 
 */
public class Person {
	
	private Person pre; // 当前人的前一个人

	private int now; // 当前这个人的号码

	private Person next; // 当前人的下一个人

	public Person() { // 空的构造函数

	}

	public Person(Person pre, int now, Person next) { // 带参的构造函数
		this.pre = pre;
		this.now = now;
		this.next = next;
	}
    /*
     * 为此类添加get set 方法
     * */
	public Person getPre() {
		return pre;
	}

	public void setPre(Person pre) {
		this.pre = pre;
	}

	public int getNow() {
		return now;
	}

	public void setNow(int now) {
		this.now = now;
	}

	public Person getNext() {
		return next;
	}

	public void setNext(Person next) {
		this.next = next;
	}
	
	public static void initPerson() {
		Person first = null;//第一个人
		Person pre = null; //前一个人
		//初始化20人
		for(int i = 1;i <= 20;i++) {
			if(i == 1) {//如果是第一个人
				first = new Person();      //直接new第一个人的对象出来
				first.setNow(i);           //设置第一个人的号码数
				pre = first;               //因为此时第一个人前面还没有人,所以将前一个人也设置为第一个人1
			}else {
				Person p = new Person();    
				p.setNow(i);         //设置号码数
				p.setPre(pre);//当前这个人的上一个人是pre
				pre.setNext(p);//上一个的下一个是当前这个人(这里有点绕需要大家自己写一下好好思考)
				if(i == 20) {
					p.setNext(first);        //当前这个人是第二十个人
					first.setPre(p);
				}
				//当前这个变成上一个
				pre = p;      //把p的值赋值给pre保证循环继续
			}
		}
		
		//开始报数
		int num = 0;//报数
		Person now = first;
		/*
		 * 这里的while循环的大体意思是,如果这个人的前一个人或者后一个人都不是他自己则循环继续,
		 * 如果这个人的前一个和后一个都是他自己那么说明就剩他一个人了,那么循环就该结束了。
		 * */
		while(!(now == now.getPre() && now == now.getNext())) {    
			num++;//开始报数
			if(num == 3) {
				//去掉now
				/*这里循环体的意思是如果此时报数的人报到了3,则将这个人淘汰*/
				now.getPre().setNext(now.getNext());
				now.getNext().setPre(now.getPre());         
				num = 0;
			}
			now = now.getNext();
		}
		System.out.println(now.getNow());        //此时循环结束也就可以得到最后剩余的这个人了
		
	}

}

再写一个测试类测试一下:

public class Test {
   public static void main(String[] args) {
	   Person person = new Person();
	   person.initPerson();
   }
}

结果如下:
在这里插入图片描述

发布了64 篇原创文章 · 获赞 2 · 访问量 850

猜你喜欢

转载自blog.csdn.net/cdut2016/article/details/103897054