链表图解

带头结点的链表:

不带头结点的链表:

区别

带头结点的链表容易代码实现

不带头结点的容易实现循环链表和双向链表

代码的实现 (增减 删除)

节点实现:

public class node
{ private int no;
public node next;
public node(int no) {
this.no = no;
} public int getNo() {
return no;
} @Override
public String toString() {
return "Node [no=" + no + "]";
}
}

链表实现:


public class linkedList {
private node head;//头结点 public linkedList() {
} public boolean add( node newhero) {//添加节点
boolean isSuccessful=false;
if(head==null){//处理空表
head=newhero;
newhero.next=head;
isSuccessful=true;
}else{//不为空时
node node= head;
while(true){
if (node.next==head){
break;
}
node=node.next;
}
node.next=newhero;
newhero.next=head;
isSuccessful=true; }
return isSuccessful; } public node delete(int index) {//删除制定节点
node outputNode = null;
node node= head; //指向第一个节点
if ((index)==0) {//查到该节点的前一个节点
outputNode = node;
head=null;
head = node.next;//删除语句
return outputNode;
}
int location=0;//计时器
while (true){ //
if (isEmpty()) {//如果链表为空中断
break;
}else if (location==index-1){//查到该节点的前一个节点
outputNode=node.next;
node.next=node.next.next;//删除语句 break;
}
if (node.next==null){
break;
}
location++;//计时器加加
node=node.next;//节点后移
}
return outputNode; } public boolean isEmpty() {
return head==null; } public void display() {//遍历整个链表 node node=head;
while(node!=null){
System.out.println(node.toString()); if (node.next.getNo()==head.getNo()){
break;
}
node=node.next; }
//1.对象不为空才能执行---->可避免空指针异常
//2.循环里的收尾不是断开的 }

链表的应用 :约瑟夫问题的求解

问题描述:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏

输入样例:

人数:39

输出样例:

安全位置是:16 31

问题分析:

1.实现节点(每个节点代表一个人,包含位置编号)

2.采用循环链表代表围成一个圈

3.每次数三个数,就删除第三个节点,重新计数,直到链表中剩下两个元素,

4.输出这两个节点

java参考代码:

 @Test
public void yuecefuTest() { int input =31;
LinkedList <Persion> people = new LinkedList <>();
LinkedList <Persion> people2 = new LinkedList <>();
for (int i = 0; i < input ;i++) {
people.add( new Persion(i+1));
}
int i = 0;
for (int j = input*2-2; j >0 ;j--) {
if (i==2){
people2.add(people.remove(i));
i=0;
}
i++;
}
for (Persion p:people
) {
System.out.println(" "+p.toString());
} }

LinkedList 源码分析

java实现单向循环链表的更多相关文章

  1. (java实现)单向循环链表

    什么是单向循环链表 单向循环链表基本与单向链表相同,唯一的区别就是单向循环链表的尾节点指向的不是null,而是头节点(注意:不是头指针). 因此,单向循环链表的任何节点的下一部分都不存在NULL值. ...

  2. Java 用单向循环链表实现 约瑟夫问题

    public class lianbiao2 { class Node{ Node next; int number; public Node getNext() { return next; } p ...

  3. 关于单向循环链表的约瑟夫问题(Java实现)

    关于单向循环链表的约瑟夫问题(Java实现) 最近在学习链表时,遇到单向循环链表中的约瑟夫问题.在构建循环链表的代码上,我有一点很不理解,遂记录下来. Josephu问题为: 设编号为1, 2,.. ...

  4. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  5. (java实现)双向循环链表

    什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的 ...

  6. 基于visual Studio2013解决算法导论之021单向循环链表

     题目 单向循环链表的操作 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  7. Python 单向循环链表

    操作 is_empty() 判断链表是否为空 length() 返回链表的长度 travel() 遍历 add(item) 在头部添加一个节点 append(item) 在尾部添加一个节点 inser ...

  8. 单向循环链表C语言实现

    我们都知道,单向链表最后指向为NULL,也就是为空,那单向循环链表就是不指向为NULL了,指向头节点,所以下面这个程序运行结果就是,你将会看到遍历链表的时候就是一个死循环,因为它不指向为NULL,也是 ...

  9. python中的单向循环链表实现

    引子 所谓单向循环链表,不过是在单向链表的基础上,如响尾蛇般将其首尾相连,也因此有诸多类似之处与务必留心之点.尤其是可能涉及到头尾节点的操作,不可疏忽. 对于诸多操所必须的遍历,这时的条件是什么?又应 ...

随机推荐

  1. laravel5.6 QQ 第三方登录

    https://socialiteproviders.github.io/providers/qq.html 1. Installation // This assumes that you have ...

  2. STS Eclipse IDEA 指定启动JDK版本

    使用场景: 开发人员在自己的机器上可能装了多个版本的JDK,但是在环境变量中只能配置一个 JAVA_HOME ,so你的IDEA Eclipse 可能因为你在 JAVA_HOME 配置JDK1.8 以 ...

  3. Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object

    Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object 资料参考:http://stack ...

  4. SQL 循环语句

    一.if语句 二.while语句 练习: 三.case when 四.练习 1. 2. 3. 4.

  5. poj 1920 Towers of Hanoi

    Towers of Hanoi Time Limit: 3000MS   Memory Limit: 16000K Total Submissions: 2213   Accepted: 986 Ca ...

  6. Java1.8 获取文件总行数

    Files.lines(Paths.get("aaa.txt")).count();

  7. [转]C#操作Memcached帮助类

    在VS中安装Memcached,直接在NuGet下搜索Memcached,选择第一个进行安装: 服务端资源下载地址:https://pan.baidu.com/s/1gf3tupl 接下来开始写程序, ...

  8. linux中添加常用应用程序的桌面图标

    在网上随处可以找到怎么样把应用程序的图标放到桌面上,我刚用ubuntu时也是按照网上的做法,一步一步的做的,现将网上的做法复制下来: 桌面配置文件简述\label{sec:desktop file} ...

  9. 2018-12-14-恢复-U-盘隐藏文件夹

    title author date CreateTime categories 恢复 U 盘隐藏文件夹 lindexi 2018-12-14 19:24:56 +0800 2018-12-14 19: ...

  10. 基于串口调试助手的WIFI模块调试-FPGA简单联网(点灯)

    根据正点原子的<ATK-ESP8266 WIFI用户手册>,使用XCOM V2.2串口调试助手测试WIFI模块[26].在本系统中运用到的功能主要是TCP/IP模式中的TCP Client ...