我们经常实用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---单链表的操作,约瑟夫问题的更多相关文章

  1. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

  2. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  3. javascript数据结构之单链表

    下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...

  4. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  5. Java数据结构之单链表

    这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...

  6. Java数据结构-02单链表(一)

    一.链式存储: ①简述:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.存储单元由两部分组成,数据源和指针,数据源放数据,指针指向下个 ...

  7. 数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

    数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删 ...

  8. 数据结构(一) 单链表的实现-JAVA

    数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...

  9. 数据结构 - 静态单链表的实行(C语言)

    静态单链表的实现 1 静态链表定义 静态链表存储结构的定义如下: /* 线性表的静态链表存储结构 */ #define MAXSIZE 1000 /* 假设链表的最大长度是1000 */ typede ...

  10. 数据结构 - 动态单链表的实行(C语言)

    动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...

随机推荐

  1. 遇到XML-GB2312网页编码的处理方法

    报的错误:encoding error : input conversion failed due to input error, bytes  I/O error : encoder error 1 ...

  2. Vue路由(vue-router)详细讲解指南

    中文文档:https://router.vuejs.org/zh/ Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.路由实际 ...

  3. 40 (OC)* 数据库常见sql语句

    1:增加INSERT INTO t_student (name, age) VALUES ('liwx', 18);2:删除DELETE FROM t_student WHERE name = 'li ...

  4. Dart函数、类和运算符-处理信息

    编程语言虽然千差万别,但归根结底,它们的设计思想无非就是回答两个问题: 1.如何表示信息: 2.如何处理信息: 函数 函数是一段用来独立地完成某个功能的代码.函数是对象类型,它的类型叫做Functio ...

  5. mysql 存储过程 (ps:用法自己看 :)

    delimiter // drop procedure if exists operate_tables // create procedure operate_tables (in db_name ...

  6. 深入解析 Kubebuilder:让编写 CRD 变得更简单

    作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubern ...

  7. NestedInteger Java

    ''' class NestedInteger { private List list; private Integer integer; public NestedInteger(List<N ...

  8. C#使用SignalR实现进度条

    需求背景  产品觉得在后台处理数据时给前端加个进度条 项目框架 .ENT framework4.5 MVC 5.0 Nuget引入 Microsoft.Owin 系列 2.0.2 Nuget引入 Mi ...

  9. Spring MVC-从零开始-分拆applicationContext. xrnl

    1.目录结构 2.web.xml配置 <?xml version="1.0" encoding="ISO-8859-1"?> <web-app ...

  10. Hadoop点滴-初识MapReduce(2)

    术语: job(作业):客户端需要执行的一个工作单元,包括输入数据.MP程序.配置信息 Hadoop将job分成若干task(任务)来执行,其中包括两类任务:map任务.reduce任务.这些任务在集 ...