java实现单向循环链表
链表图解
带头结点的链表:
不带头结点的链表:
区别
带头结点的链表容易代码实现
不带头结点的容易实现循环链表和双向链表
代码的实现 (增减 删除)
节点实现:
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实现单向循环链表的更多相关文章
- (java实现)单向循环链表
什么是单向循环链表 单向循环链表基本与单向链表相同,唯一的区别就是单向循环链表的尾节点指向的不是null,而是头节点(注意:不是头指针). 因此,单向循环链表的任何节点的下一部分都不存在NULL值. ...
- Java 用单向循环链表实现 约瑟夫问题
public class lianbiao2 { class Node{ Node next; int number; public Node getNext() { return next; } p ...
- 关于单向循环链表的约瑟夫问题(Java实现)
关于单向循环链表的约瑟夫问题(Java实现) 最近在学习链表时,遇到单向循环链表中的约瑟夫问题.在构建循环链表的代码上,我有一点很不理解,遂记录下来. Josephu问题为: 设编号为1, 2,.. ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- (java实现)双向循环链表
什么是双向循环链表 在了解双向循环链表之前,如果对链表还没有一个清晰的概念,建议你看看单链表和单向循环链表,这有利于你更好的理解下面的内容.(废话有点多[逃] 相比单链表,双向循环链表是一个更加复杂的 ...
- 基于visual Studio2013解决算法导论之021单向循环链表
题目 单向循环链表的操作 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> ...
- Python 单向循环链表
操作 is_empty() 判断链表是否为空 length() 返回链表的长度 travel() 遍历 add(item) 在头部添加一个节点 append(item) 在尾部添加一个节点 inser ...
- 单向循环链表C语言实现
我们都知道,单向链表最后指向为NULL,也就是为空,那单向循环链表就是不指向为NULL了,指向头节点,所以下面这个程序运行结果就是,你将会看到遍历链表的时候就是一个死循环,因为它不指向为NULL,也是 ...
- python中的单向循环链表实现
引子 所谓单向循环链表,不过是在单向链表的基础上,如响尾蛇般将其首尾相连,也因此有诸多类似之处与务必留心之点.尤其是可能涉及到头尾节点的操作,不可疏忽. 对于诸多操所必须的遍历,这时的条件是什么?又应 ...
随机推荐
- oracle函数 VSIZE(X)
[功能]返回X的大小(字节)数 [参数]x select vsize(user),user from dual; 返回:6 asdied select length('adfad合理') " ...
- 「POI2012」约会 Rendezvous
#2691. 「POI2012」约会 Rendezvous 这题我简直不想说什么了,什么素质,卡常数…… “每个顶点有且仅有一条出边”,所以是一道基环树的题,首先tarjan缩点,在缩完点后的图上求a ...
- python如何自动发送邮件
#coding=utf-8 import smtplib from email.mime.text import MIMEText from email.mime.application import ...
- HTTP协议详解以及URL具体访问过程(转载)
https://blog.csdn.net/f45056231p/article/details/82533490
- 洛谷P4860 Roy&October之取石子II 题解 博弈论
题目链接:https://www.luogu.org/problem/P4860 和<P4018 Roy&October之取石子>一样的推导思路,去找循环节. 可以发现:只要不能被 ...
- RBF神经网络通用函数 newrb, newrbe
RBF神经网络通用函数 newrb, newrbe 1.newrb 其中P为输入向量,T为输出向量,GOAL为均方误差的目标,SPREED为径向基的扩展速度.返回值是一个构建好的网络,用newrb ...
- Python--day40--全局解释器锁
1,起一百个线程和起一百个进程所花的时间对比(开启效率的较量): import time from threading import Thread from multiprocessing impor ...
- Python--day61--Django项目配置相关
static文件查找:
- js基础——变量、作用域、内存
1.new关键字创建的是引用类型: eg. var box = new Object(); box.name = "Linda";//引用类型添加属性没问题 al ...
- 提前终止forEach技巧,使用try catch
学习react优化性能的时候,在render之前,生命周期shouldComponentUpdate里判断前后两次数据是否一致,使用了forEach嵌套if语句,如果满足条件想直接break跳出for ...