关于单链表的增删改查方法的递归实现(JAVA语言实现)
因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了;
写该类的目的:
1.练习递归
2.为深入理解java集合框架底层源码打好基础
学习的视频看的慕课网liuyubobo老师的课程:Java玩转数据结构 从入门到进阶
废话不多说,以下为源代码:
 public class LinkedList<E extends Comparable<E>> {
     //链表节点内部类
     private class Node{
         E e;
         Node next;
         public Node(E _e,Node _next){
             this.e = _e;
             this.next = _next;
         }
         public Node(E _e){
             this(_e, null);
         }
         public Node(){
             this(null, null);
         }
     }
     //头节点
     private Node head;
     //链表实际存储大小
     private int size;
     //无参构造函数
     public LinekedList(){
         this.head = null;
         this.size = 0;
     }
     //判断链表是否为空
     public boolean isEmpty(){
         return this.size == 0;
     }
     public int size(){
         return this.size;
     }
     //在链表头添加节点
     public void addFirst(E e){
         add(0, e);
     }
     //在链表尾添加节点
     public void addLast(E e){
         add(size, e);
     }
     //在链表指定位置添加节点
     public void add(int index,E e){
         if (index < 0 || index > size) {
             throw new IllegalArgumentException("Index is error.");
         }
         head = add(index, e, head);
     }
     //通过递归实现链表的添加
     private Node add(int index,E e,Node node){
         if (index == 0 && node == null) {
             this.size++;
             return new Node(e);
         }
         if (index == 0) {
             this.size++;
             Node newNode = new Node(e);
             //newNode.next = node.next;
             newNode.next = node;
             //node.next = newNode;
             return newNode;
         }
         node.next = add(index - 1, e, node.next);
         return node;
     }
     /**
      * 用于根据索引查找对应的节点,
      * @param index
      * @param node
      * @return 相应的节点对象
      */
     private Node getElementByIndex(int index,Node node){
         if (index == 0 && node != null) {
             return node;
         }
         Node ret = getElementByIndex(index - 1, node.next);
         return ret;
     }
     //删除链表头节点
     public E removeFirst(){
         return remove(0);
     }
     //删除链表尾结点
     public E removeLast(){
         return remove(size - 1);
     }
     //删除指定位置节点,并返回删除节点值
     public E remove(int index){
         if (isEmpty()) {
             throw new IllegalArgumentException("List is empty.");
         }
         if (index < 0 || index >= size) {
             throw new IllegalArgumentException("Index is error.");
         }
         Node ret = getElementByIndex(index, head);
         head = remove(index, head);
         return ret.e;
     }
     //递归删除节点值
     private Node remove(int index,Node node){
         if (node == null) {
             return node;
         }
         if (index == 0) {
             Node delNode = node;
             node = delNode.next;
             delNode.next = null;
             this.size--;
             return node;
         }
         node.next = remove(index - 1, node.next);
         return node;
     }
     //修改指定位置节点的值,通过递归实现
     public void set(int index,E e){
         if (isEmpty()) {
             throw new IllegalArgumentException("List is empty.");
         }
         if (index < 0 || index >= size) {
             throw new IllegalArgumentException("Index is error.");
         }
         set(index, e, head);
     }
     private void set(int index,E e,Node node){
         if (node == null) {
             return;
         }
         if (index == 0) {
             node.e = e;
         }
         set(index - 1, e, node.next);
         return;
     }
     //获取链表头节点的值
     public E getFirst(){
         return get(0);
     }
     //获取链表尾结点的值
     public E getLast(){
         return get(size - 1);
     }
     //获取链表制定位置的值,通过递归实现
     public E get(int index){
         if (isEmpty()) {
             throw new IllegalArgumentException("List is empty.");
         }
         if (index < 0 || index >= size) {
             throw new IllegalArgumentException("Index is error.");
         }
         return get(index, head).e;
     }
     private Node get(int index,Node node){
         if (node == null) {
             return node;
         }
         if (index == 0) {
             return node;
         }
         Node ret = get(index - 1, node.next);
         return ret;
     }
     //查询链表中的节点是否包含值e
     public boolean contains(E e){
         return contains(e, head);
     }
     private boolean contains(E e,Node node){
         if (node == null) {
             return false;
         }
         if (node.e == e) {
             return true;
         }
         return contains(e, node.next);
     }
     //重写Object类的toString方法:也是通过链表天然的递归性,来访问
     //链表的每一个节点
     @Override
     public String toString() {
         StringBuilder res = new StringBuilder();
         res.append("Font -> ");
         linkToString(head, res);
         return res.toString();
     }
     private void linkToString(Node node,StringBuilder res){
         if (node == null) {
             res.append("NULL");
             return;
         }
         res.append(node.e + " -> ");
         linkToString(node.next, res);
         return;
     }
     /*public static void main(String[] args) {
         LinekedList<Integer> ll = new LinekedList<>();
         for (int i = 0; i < 13; i++) {
             ll.addLast(i);
             System.out.println(ll.toString());
         }
         System.out.println("------------------");
         for (int i = 0; i < 11; i++) {
             Integer ii = ll.removeFirst();
             System.out.println(ii);
             System.out.println(ll.toString());
         }
     }*/
 }
有一些方法测了,但是有些方法没测,有需要可以自行参考(不保证准确啊...)
该类主要包含链表的增删改查,里面加了索引主要是为了好理解(注:链表是没有索引的).
因为,才刚开始熟悉递归以及数据结构,所以需要各位大佬的多多指正
有建议的可以在评论中指出.
关于单链表的增删改查方法的递归实现(JAVA语言实现)的更多相关文章
- 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)
		目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ... 
- python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)
		day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ... 
- hibernate对单表的增删改查
		ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ... 
- Django学习笔记(10)——Book单表的增删改查页面
		一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ... 
- 通用mapper的增删改查方法   留存  备忘
		Mybatis通用Mapper介绍与使用 前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQ ... 
- java实现单链表的增删改以及排序
		使用java代码模拟单链表的增删改以及排序功能 代码如下: package com.seizedays.linked_list; public class SingleLinkedListDemo { ... 
- Mybatis(一)实现单表的增删改查
		1.1 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ... 
- Spring Data CrudRepository增删改查方法(八)
		CrudRepository 的主要方法 long count(); boolean exists(Integer arg0); <S extends StudentPO> S sav ... 
- Django REST framework 五种增删改查方法
		Django-DRF-视图的演变 版本一(基于类视图APIView类) views.py: APIView是继承的Django View视图的. 1 from .serializers impor ... 
随机推荐
- ALS交替最小二乘法总结
			摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 ALS是alternating least squares的缩写 , 意 ... 
- ToB蓝海的台阶-PaaS,SaaS技术详解
			前言 随着大量SaaS公司进入市场,我们看到颠覆性的软件服务以各种方式进入企业流程-从营销工具到支付系统.随着SaaS帮助优化业务流程,实现更流畅和自动化的运营,风险投资公司首先潜入池中寻找最优秀和最 ... 
- Android进阶加密-第1章-Android系统架构-读书笔记
			第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ... 
- DES加解密
			package encrypt; import java.security.Key; import java.security.SecureRandom; import java.util.Base6 ... 
- NIO(生活篇)
			今晚是个下雨天,写完今天最后一行代码,小鲁班起身合上电脑,用滚烫的开水为自己泡制了一桶老坛酸菜牛肉面.这大概是苦逼程序猿给接下来继续奋战的自己最好的馈赠.年轻的程序猿更偏爱坐在窗前,在夜晚中静静的享受 ... 
- 优雅地 `async/await`
			async/await 虽然取代了回调,使用类似同步的代码组织方式让代码更加简洁美观,但错误处理时需要加 try/catch. 比如下面这样,一个简单的 Node.js 中使用 async/await ... 
- 用C语言做一个横板过关类型的控制台游戏
			前言:本教程是写给刚学会C语言基本语法不久的新生们. 因为在学习C语言途中,往往只能写控制台代码,而还能没接触到图形,也就基本碰不到游戏开发. 所以本教程希望可以给仍在学习C语言的新生们能提前感受到游 ... 
- java到底是引用传递还是值传递?
			今天我们来讲讲一个在学习中容易误解的问题,面试中也偶尔问到,java方法调用时到底是值传递还是引用传递? 首先,请大家来做一个判断题,下面的3个问题是否描述正确 1. java基本数据类型传递是值传递 ... 
- PLM与企业信息化
			http://blog.itpub.net/31532639/viewspace-2199409/ PLM的发展历史及其与PDM的关系 在ERP.SCM.CRM以及PLM这4个系统中,PLM ... 
- iTop软件功能分析以及优缺点比较
			iTop软件功能分析以及优缺点比较 iTop对标文档 1. 概述 2. CMDB 3. 主要功能模块 3.1 配置管理(Configuration Managment) 3.2 用户请求管理(Help ... 
