对于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();
}
}
结果如下: