基于循环双链表的一道编程题(java实现)
来源:互联网 发布:nba季后赛各项数据统计 编辑:程序博客网 时间:2024/05/20 18:53
题目如下:
n个人(第一个人序号为1,第二个为2…第三个人为n)围成一圈从第一个人开始从1到3一次循环报数,报到3的人出列,下一个人开始从1重新开始报数,求最后留下的人的序号。(20分)
举例:5个人围成一圈,一次编号为一,二,三,四,五。从一号开始报数,一号报1,二号报2,三号报3,三号出列。圈中剩一,二,四,五,四号从1重新开始报数,四号报1,五号报2,一号报3,一号出列,以此类推。
源代码:
package com.xz.java02;
import java.util.ArrayList;
//定义一个接口 //其实没必要,只是为了复习一下接口知识
interface List{
//创建一个循环链表的方法
void print();
int Length();
}
class MyNode{
public int value;
public int flag;
MyNode pre;
MyNode next;
MyNode(int value,MyNode pre,MyNode next){
this.pre=pre;
this.next=next;
this.value=value;
}
MyNode(){
}
}
class MyList implements List{
//定义一个带有头节点的双向循环链表
private MyNode Head=new MyNode(); //头节点
int length; //链表长度
MyList(){
this.Head.next=Head; //构造函数,创建一个头节点
this.Head.pre=Head;
}
public MyList(int arr[]){ //尾插法创建一个链表,将指定数组中的元素插入
this(); //创建一个只有头节点的链表
//尾节点
MyNode Rear=this.Head.next;
Rear.next=this.Head;
this.Head.next=Rear;
for(int i=0;i<arr.length;i++){
MyNode p=new MyNode();
p.value=arr[i];
Rear.next=p;
p.pre=Rear;
Rear=p;
this.length++;
}
Rear.next=this.Head;
Head.pre=Rear;
}
public int Length(){
return this.length;
}
public void Delete(int index){ //删除指定位置的元素
MyNode p=this.Head.next;
for(int i=0;i<index;i++){
p=p.next;
}
p.pre.next=p.next;
p.next.pre=p.pre.next;
this.length--;
}
//删除某个节点的操作
public void Delete(MyNode p){
p.pre.next=p.next;
p.next.pre=p.pre;
this.length--;
}
public void print(){
MyNode p=this.Head.next;
for(int i=0;i<this.Length();i++){
System.out.print(p.value+" ");
p=p.next;
}
//System.out.println();
}
//实现题目所给功能:给每个节点增加一个Flag值,Flag值即1、2、3,从第一个节点开始,如果这个节点的
//Flag值不等于3则,指针往下移,并且他的后继结点的Flag值等于它的前驱节点Flag值加1,如果该节点的
//Flag值等于3,让他的后继结点的Flag值等于1,并且则删除这个节点,如此循环直到表的长度为1,则输出
//该节点的value值!(如果某个节点的下一个节点是头节点,则需要将此节点指向头节点的下一个节点)
public void FindLast(){
MyNode p=this.Head.next;
p.flag=1;
for(int count=1;this.Length()>1;){
if(p.flag==3){
if(p.next==Head){ //如果某个节点的下一个节点是头节点,则指向头节点的下一个节点,因为头节点为空
p=p.next.next;
p.flag=1;
System.out.println("第"+count+"次删除的是:"+p.pre.pre.value);
Delete(p.pre.pre);
}
else {
p.next.flag=1;
p=p.next;
System.out.println("第"+count+"次删除的是:"+p.pre.value);
Delete(p.pre);
}
count++;
}
else{
if(p.next==Head){
p=p.next.next;
p.flag=p.pre.pre.flag+1;
}
else{
p=p.next;
p.flag=p.pre.flag+1;
}
}
}
System.out.println("最后一次删除的是:"+p.value);
}
}
public class Demo02 {
public static void main(String[] args) {
//测试是否创建成功
int Arr[]={1,2,3,4,5};
MyList l=new MyList(Arr);
System.out.print("总人数为:");
l.print();
System.out.println();
l.FindLast();
}
}
- 基于循环双链表的一道编程题(java实现)
- 字符串循环移位 - 编程珠玑的一道题
- 一道经典的Java多线程编程题
- 一道经典的Java多线程编程题
- 一道经典的Java多线程编程题
- 一道经典的Java多线程编程题
- 一道JAVA笔试编程题
- 基于Java的Spark WordCount编程实现
- Java基于数组和循环实现的控制台五子棋
- 一道经典的for循环笔试题
- 一道很小的编程题
- 一道printf的编程题
- 一道有趣的编程题
- 360的一道编程题
- 一道简单的编程题
- 一道java编程的面试题
- 基于单链表的循环链表以及双链表的实现
- 关于Java For循环的一道面试题
- 《C++》12 C++ 重载运算符和重载函数
- CSS
- STL stack
- 第五周项目2 游戏中角色类的设计(1)
- get()和load()的区别
- 基于循环双链表的一道编程题(java实现)
- centos7下yum安装mysql与卸载mysql
- c++作业2
- linux教程:配置Tomcat开机启动 centos7
- 单例模式
- 对一个才子的走访我学到了什么?
- Aizu 0525(Osenbei 穷竭搜索)
- python 元类的使用(orm框架搭建)
- 克服当众表达的恐惧心理-《卡耐基语言的突破与相处的艺术》(美)卡耐基