package 数据结构算法.链表;

/*
*定义节点
* 链表由节点构成
*/
public class Node<E> {
private E e; //数据data
private Node<E> next; //指向下一个节点 public Node() { } public Node(E e) {
this.e = e;
} public Node<E> getNext() {
return next;
} public void setNext(Node<E> next) {
this.next = next;
} public E getE() {
return e;
} public void setE(E e) {
this.e = e;
}
}
package 数据结构算法.链表;

/*
* 定义实现类MyLinkedList
 * 实现链表的基本功能:增删改查
*/
public class MyLinkedList<E> {
//声明头节点尾节点
private Node<E> head;
private Node<E> last;
//链表的大小
private int size;
private int modcount; //计算被修改的次数 public MyLinkedList() {
head = new Node<E>();//实例化头结点
last = head;
} /*
*返回单链表中存储的元素总数
*/
public int size() {
return size;
} /*
*获取指定索引位置的节点对象
*/
public Node<E> get(int index) {
if (index < 0 || index > size - 1)
return null;
Node<E> node = head.getNext();//将头结点的下一个节点赋给Node
for (int i = 0; i < index; i++) {
node = node.getNext();//获取node的下一个节点
}
return node;
} /*
*获取指定索引位置的数据
*/
public E getValue(int index) {
if (index < 0 || index > size - 1)
return null;
Node<E> node = get(index);
return node.getE();
} /*
*增加元素
*/
public void add(E e) {
Node<E> node = new Node<E>(e); //以e实例化一个节点
last.setNext(node);//往尾节点后追加节点
last = node;//该节点设为最后一个节点
size++;
modcount++;
} /*
*指定位置插入元素,返回插入的节点数据
*/
public E add(int index, E e) {
if (index < 0 || index > size - 1)
return null;
Node<E> node = new Node<E>(e); //实例化一个节点
//找到插入的原节点
Node<E> oldNode = get(index);
if (index == 0) {//当索引为0时
head.setNext(node);
} else {
//找到插入节点的上一个
Node<E> bNode = get(index - 1);
bNode.setNext(node);
}
node.setNext(oldNode);
size++;
modcount++;
return oldNode.getE();
} /*
*删除指定的节点e,并返回删除节点的数据
*/
public E delete(int index) {
if (index < 0 || index > size - 1)
return null;
if (index == 0) {//当索引为1,令头结点的下一个节点为头结点
Node<E> node = head.getNext();
head.setNext(node.getNext());
}
//获取要删除节点的前一个节点
Node<E> bNode = get(index - 1);
//获取要删除的节点
Node<E> Node = bNode.getNext();
//获取要删除节点的下一个节点
Node<E> nNode = Node.getNext();
//删除该节点
bNode.setNext(nNode);
//清除Node的下一个节点
Node.setNext(null);
size--;
modcount++;
return Node.getE();//返回节点中的数据域
} /*
*修改指定位置的数据域并返回修改后的数据
*/
public E set(int index, E e) {
if (index < 0 || index > size - 1)
return null;
//获取指定位置的原节点
Node<E> node = get(index);
node.setE(e);
modcount++;
return node.getE();
}
}
package 数据结构算法.链表;

/*
*定义测试类
*/
public class MyLinkedListTest {
public static void main(String[] args) {
MyLinkedList<String> list = new MyLinkedList<>(); //测试add
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add(0,"newone");
list.add(1,"newtwo");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.getValue(i)+" ");
} //测试set
System.out.println();
list.set(0, "111");
list.set(1, "222");
System.out.println(list.getValue(0) + " " + list.getValue(1)); //测试delete
System.out.println();
list.delete(1);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.getValue(i)+" ");
}
}
}

运行结果如下:

参考自:https://zhuanlan.zhihu.com/p/30141170

java实现单链表增删改查的更多相关文章

  1. Java连接MySQL数据库增删改查通用方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java连接MySQL数据库增删改查通用方法 运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类 ...

  2. Java实现mongodb原生增删改查语句

    Java实现mongodb原生增删改查语句 2018-03-16 自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb 结构 代码 0 pom.xml < ...

  3. vue.js带复选框表单的增删改查

    近段时间由于公司项目要求,前端开始使用VUE框架进行开发,最近刚开始学习,做了一个表单的增删改查,和大家分享一下. 页面模型代码设计如下 <template> <div id=&qu ...

  4. django-orm框架表单的增删改查

    08.14自我总结 django-orm框架 一.orm基本配置 1.创建django项目 命令行:cmd先去到django创建目录,然后输入django-admin startproject dja ...

  5. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  6. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  7. java实现双向链表的增删改查

    双向链表的增删改查 和单链表的操作很像:https://blog.csdn.net/weixin_43304253/article/details/119758276 基本结构 1.增加操作 1.链接 ...

  8. Java连接MongoDB进行增删改查

    1.导入必须的包: 详情看项目:http://pan.baidu.com/s/1cvDAOY 2.通过Myeclipse创建WEB项目 3. 3.bean:创建实体类 package com.bean ...

  9. java实现xml文件增删改查

    java一次删除xml多个节点: 方案1.你直接改动了nodeList,这一般在做循环时是不同意直接这么做的. 你能够尝试在遍历一个list时,在循环体同一时候删除list里的内容,你会得到一个异常. ...

随机推荐

  1. C#获取系统服务+进程+启动时间

    原文:C#获取系统服务+进程+启动时间 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/weixin_38208401/article/details ...

  2. Linux操作系统 和 Windows操作系统 的区别

    针对这两个操作系统,下面是几点区别. 1.免费与收费 在中国, windows 和 linux 都是免费的,至少对个人用户是如此,如果哪天国内windows真的严打盗版了,那linux的春天就到了!但 ...

  3. pandas读取xlsx

    一.使用pandas读取xlsx 引用pandas库 import pandas as pd pd.read_excel(path, sheet_name=0, header=0, names=Non ...

  4. Eclipse规范注释及注释文档的生成

    Eclipse作为JavaIDE(Integrated Development Environment,集成开发环境),可以通过设置自动添加Javadoc注释信息,如@author 作者名.@vers ...

  5. mongodb常用基本命令

    一.数据库常用命令 1.help查看命令提示 help db.help() db.test.help() db.test.find().help() 2.创建.切换数据库 use movies 3.查 ...

  6. cut sort uniq wc 一 文本处理工具

    cut cut是一个选取命令,就是将一段数据经过分析,取出我们想要的. 一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. -c : 以字符为单位进行分割. c ...

  7. NX二次开发-UFUN获取工程图的数量和tag UF_DRAW_ask_drawings

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> #include < ...

  8. [JZOJ 5814] 树

    题目:从u到v经过多少条边. 思路: 考虑他是怎么走的?? 从\(u\)到\(v\)一定是\(fa[u]\),\(fa[fa[u]]\),反正就是走\(LCA\),那么如果算出每个点到父亲的期望步数, ...

  9. spring boot+vue.js发送post时一直415,swagger却很正常

    首先百度说要加header为applicaiton/json,加完后一直400,说json不符合格式,webstorm说要单引号,spring boot那边要双引号...... 后来不知道看了哪里说把 ...

  10. python数据结构之图的实现方法

    python数据结构之图的实现方法 本文实例讲述了python数据结构之图的实现方法.分享给大家供大家参考.具体如下: 下面简要的介绍下: 比如有这么一张图:     A -> B     A ...