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语言清空指针

    #include <stdio.h> int main() { /********************************************* * * %d int * %f ...

  2. css 给图片添加滤镜效果,透明层毛玻璃效果

    我们用的第一个滤镜是sepia(),他会给图片增加一整降饱和度的橙色染色效果 原图 添加sepia滤镜的效果 img{ width:100%; transition: .5s filter; filt ...

  3. Ubuntu下搭建NFS,并在开发板挂载

    ---恢复内容开始--- zai root huanjingxiachaozhuo $ su 一.搭建NFS 1.执行命令:sudo apt-get install nfs-kernel-server ...

  4. HTTP状态码及请求头

    状态码 状态码告知从服务器端返回的请求结果 一般可分为5个大类 1XX Informational(信息性状态码) 2XX Success(成功状态码) 3XX Redirection(重定向状态码) ...

  5. nacos配置服务入门

    1.nacos服务端部署 参见官方文档:https://nacos.io/zh-cn/docs/quick-start.html 2.nacos配置中心功能使用 在pol文件中添加依赖: 在启动类中使 ...

  6. Java 基础 - JDK 和 JRE 有什么区别

    总结 JRE(Java Runtime Environment),就是 Java 运行环境,包括JVM虚拟机(java.exe等)和基本的类库(rt.jar等). JDK (Java Developm ...

  7. luoguP3370 【模板】字符串哈希 [hash]

    题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转 ...

  8. flume的安装和使用

    1.下载 [linyouyi@hadoop01 software]$ wget https://mirrors.aliyun.com/apache/flume/1.9.0/apache-flume-1 ...

  9. NX二次开发-UFUN打开信息窗口UF_UI_open_listing_window()

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); //方法1(uc1601) uc1601();// ...

  10. 其它课程中的python---3、numpy总结(非常全)

    其它课程中的python---3.numpy总结(非常全) 一.总结 一句话总结: 学习方式应该是:听课+总结:-->找总结博客+再总结 需要始终记住:凭借,继承,复用 1.numpy的主要功能 ...