数据结构1_java---单链表的操作,约瑟夫问题
我们经常实用c++来建立链表,为了学习的方便,此处我使用java实现了对链表的增删改查功能
整个过程较为简单。仅供参考
流程:
(1)通过内部类Node建立结点,内部变量作为指针域和数据域,并写下构造函数
(2)通过建立对象初始化头结点,也可直接在main函数中建立头结点,创建带有N个结点的链表
(3)建立链表的函数为public void create(int n),带有n个结点
(4)删除结点函数 public void delete(int i)
(5)插入结点函数 public void insert(int i,int m)
(6)寻找结点函数有两类,一个是通过位置寻找,一个是通过数值寻找
(7)最后是打印链表内容
package Main; import java.util.Scanner; /*链表操作*/
public class Main{
public static Node head; //建立头结点
class Node{ //内部类Node用于建立结点
public int data; //数据域
public Node next; //指针域
public Node()
{
super();
}
public Node(int data) //初始化数据域
{
this.data = data;
}
}
public Main() //通过建立对象初始化头结点,也可直接在main函数中建立头结点
{
head = new Node();
}
public Main(int n)
{
this();
create(n); //创建带有N个结点的链表
}
//建立链表
public void create(int n)
{
Node init = new Node();
init = head; //新建一个结点指向头结点
Scanner aScanner = new Scanner(System.in);
int data;
while(n!=0)
{
data = aScanner.nextInt();
Node pNode = new Node(data);
init.next = pNode; //将当前结点指向新建的结点
init = init.next; //结点右移
n--;
}
}
//删除结点
public void delete(int i)
{
Node pNode = new Node();
pNode = head;
i--;
while(pNode.next!=null&&i!=0) //遍历找到结点i
{
pNode = pNode.next;
i--;
}
pNode.next = pNode.next.next; //直接将该节点跨过
}
//插入结点
public void insert(int i,int m)
{
Node pNode = new Node();
pNode = head;
i--;
while(pNode.next!=null&&i!=0)
{
pNode = pNode.next;
i--;
}
Node aNode = new Node(m);
aNode.next = pNode.next;
pNode.next = aNode;
}
/*寻找结点*/
//按位置寻找
public int find(int m)
{
Node pNode = new Node();
pNode = head;
while(pNode.next!=null&&m!=0)
{
pNode = pNode.next;
m--;
}
return pNode.data;
}
//按值寻找
public int indexof(int k)
{
Node pNode = new Node();
pNode = head;
int location=0;
while(pNode.next!=null)
{
pNode = pNode.next;
location++;
if(pNode.data==k) //判断,若是则返回位置,否则返回-1
return location;
}
return -1;
}
public void print() //打印链表
{
Node print = new Node();
print = head;
while(print.next!=null)
{
print = print.next;
System.out.print(print.data+" ");
}
System.out.println();
}
public static void main(String[] args) {
Main aMain = new Main(5); // 建立一个带有5结点的链表
aMain.insert(4, 100); //在位置4处插入数字100
int findresult_1 = aMain.find(2); //寻找位置2处的数据
int findresult_2 = aMain.indexof(35); //寻找数据35所处的结点位置
aMain.print();
System.out.println("第2个结点的数据查询为:"+findresult_1);
if(findresult_2==-1)
{
System.out.println("未检测到要查询的数据");
}else {
System.out.println("数据35的查询位置为:"+findresult_2);
}
System.out.println("删除后的链表为:");
aMain.delete(5); //删除位置5处的结点
aMain.print();
}
}
算法,可直接插入其中,修改main即可!!
public void algorithm(int m)
{
Node pNode = new Node();
pNode = head;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
pNode = pNode.next;
while(pNode.data==0)
{
pNode = pNode.next;
}
}
System.out.println(pNode.data);
pNode.data=0;
}
}
数据结构1_java---单链表的操作,约瑟夫问题的更多相关文章
- java实现单链表常见操作
一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...
- Python数据结构之单链表
Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...
- javascript数据结构之单链表
下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...
- 数据结构之单链表的实现-java
一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...
- Java数据结构之单链表
这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...
- Java数据结构-02单链表(一)
一.链式存储: ①简述:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.存储单元由两部分组成,数据源和指针,数据源放数据,指针指向下个 ...
- 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)
数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...
- 数据结构(一) 单链表的实现-JAVA
数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...
- 数据结构 - 静态单链表的实行(C语言)
静态单链表的实现 1 静态链表定义 静态链表存储结构的定义如下: /* 线性表的静态链表存储结构 */ #define MAXSIZE 1000 /* 假设链表的最大长度是1000 */ typede ...
- 数据结构 - 动态单链表的实行(C语言)
动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...
随机推荐
- JSP官方文档(JavaServer Pages Specification)下载
找了好久,终于找到官网的下载地址了.这样,就可以用一手的文档资料了! 下载地址:http://download.oracle.com/otndocs/jcp/jsp-2_3-mrel2-spec/ s ...
- java架构之路-(12)JVM垃圾回收算法和垃圾回收器
接上次JVM虚拟机堆内存模型来继续说,上次我们主要说了什么时候可能把对象直接放在老年代,还有我们的可能性分析,提出GCroot根的概念.这次我们主要来说说垃圾回收所使用的的算法和我们的垃圾回收器,需要 ...
- 转换地图 (康托展开+预处理+BFS)
Problem Description 在小白成功的通过了第一轮面试后,他来到了第二轮面试.面试的题目有点难度了,为了考核你的思维能量,面试官给你一副(2x4)的初态地图,然后在给你一副(2x4)的终 ...
- java树形结构工具类
一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...
- Mybatis多数据源读写分离(注解实现)
#### Mybatis多数据源读写分离(注解实现) ------ 首先需要建立两个库进行测试,我这里使用的是master_test和slave_test两个库,两张库都有一张同样的表(偷懒,喜喜), ...
- Navicat Premium 连oralce报错:oracle library is not loaded
我装的Navicat Premium是64位的,计算机也是64位的,故在oracle网上下了一个64位的instantclient-basic-windows.x64-11.2.0.4.0.zip 地 ...
- Chrome 查看产品原型图
1.找到产品发的原型图 2.找到文件resources\chrome\axure-chrome-extension,修改文件的后缀为rar,然后解压 3.找到chrome的extensions,找到开 ...
- [Design Patterns] 03. Behavioral Patterns - Observer Pattern
前言 参考资源 Ref: 史上最全设计模式导学目录(完整版) 观察者模式-Observer Pattern[学习难度:★★★☆☆,使用频率:★★★★★] 对象间的联动——观察者模式(一):多人联机对战 ...
- 线控性能比拼,MKZ与CRV作为自动驾驶开发平台的全面测评
全球自动驾驶创业公司最主流的测试开发用车是林肯MKZ,这是因为其高性能高精度的线控能力表现,易于使用逆向工程实现改装,以及存在成熟的线控改造服务提供商AS和Dataspeed,共同为自动驾驶初创及辅助 ...
- JavaScript之基本概念(二)
今天主要介绍两个东西:JS标识符和数据类型 一 变量和常量 在介绍标识符之前有必要先了解一下JS中的变量和常量. 变量:程序执行期间可操作的临时存储数据的内存空间. 声明方式: var:函数作用域,变 ...