当前位置: 首页 > news >正文

台州企业建站程序南宁网站建设优化服务

台州企业建站程序,南宁网站建设优化服务,全国小学网站建设,办理网站域名加急备案目录 引出从ArrayList到Linkedlist手动实现ArrayList从ArrayList到LinkedList 总体设计Node类Node的方法:根据index找node 增删改查的实现增加元素删除元素修改元素查询元素 toString方法完整代码List接口类LinkedList的实现测试类 总结 引出 1.linkedList的节点&am…

目录

  • 引出
  • 从ArrayList到Linkedlist
    • 手动实现ArrayList
    • 从ArrayList到LinkedList
  • 总体设计
    • Node类
    • Node的方法:根据index找node
  • 增删改查的实现
    • 增加元素
    • 删除元素
    • 修改元素
    • 查询元素
  • toString方法
  • 完整代码
    • List接口类
    • LinkedList的实现
    • 测试类
  • 总结

引出


1.linkedList的节点,当前,上一个,下一个的思想;
2.根据index找node的方法,根据index确定从头部还是尾部;
3.linkedlist的增删改查的实现,本质是改变节点的信息;
4.递归方法实现自定义链表的toString方法;

从ArrayList到Linkedlist

在这里插入图片描述

手动实现ArrayList

Java进阶(3)——手动实现ArrayList & 源码的初步理解分析 & 数组插入数据和删除数据的问题

在这里插入图片描述

从ArrayList到LinkedList

如果发生对表的一些插入和删除操作,特别是对表的前端进行,那么数组就不是一种好的选择。另一种数据结构:链表(linked list)。

在这里插入图片描述

链表由一系列节点组成,这些节点不必在内存中相连。每一个节点均含有表元素和到包含该元素后继元的节点的链(link)。我们称之为next链。最后一个单元的next链引用null。

在这里插入图片描述

链表的插入

在这里插入图片描述

让每一个节点持有一个指向它在表中的前驱节点的链,我们称之为双链表(doubly linked list)。

在这里插入图片描述

总体设计

在这里插入图片描述

在考虑设计方面,我们将需要提供三个类:
1.MyLinkedList类本身,它包含到两端的链、表的大小以及一些方法。
2.Noe类,它可能是一个私有的嵌套类。一个节点包含数据以及到前一个节点的链和到下一个节点的链,还有一些适当的构造方法。
3.LinkedListIterator类,该类抽象了位置的概念,是一个私有类,并实现接口Iterator。它提供了方法next、hasNext和remove的实现。

标记节点:

前端创建一个额外的节点,逻辑上代表开始的标记。这些额外的节点有时候就叫作标记节点(sentinel node);特别地,在前端的节点有时候也叫作头节点(header node),而在末端的节点有时候也叫作尾节点(tail node)

在这里插入图片描述

Node类

私有的内部类

  • 当前节点,前置节点,后续节点;
  • 表示链表中的一个基本元素;

在这里插入图片描述

/*** 内部类,节点;属性,当前节点,前置节点,后续节点* @param <T>*/private static class Node<T> {T item; // 当前的节点Node<T> next; // 下一个节点Node<T> prev; // 前置节点Node(Node<T> prev,T element,Node<T> next) {this.item = element;this.prev = prev;this.next = next;}@Overridepublic String toString() {String nextStr = null;if (next!=null){nextStr = next.item.toString();}String prevStr = null;if (prev!=null){prevStr = prev.item.toString();}return "Node{" +" prev=" + prevStr +",item=" + item +", next=" + nextStr +'}';}}

在这里插入图片描述

Node的方法:根据index找node

思路:从头部开始找,进行循环

    public Node<T> NodeByIndex(int index){Node<T> x = first; // 从头部开始找for (int i = 0; i<index;i++){x = x.next;}return x;}

源码采用如下策略

  • 1.根据index和list的size确定从头部还是尾部找;
  • 2.根据index找node节点;

在这里插入图片描述

分析:

降低了复杂度:

如果都从头部找,时间复杂度就是O(i),在最极端的情况下,根据index找最后一个,时间复杂度是O(N);

如果是先确定从头部找,还是从尾部找,则时间复杂度最大是O(N/2);

增删改查的实现

增加元素

最简单的情况,都是从尾部新增元素

  • 1.新的节点的上一个节点为之前的尾部节点;
  • 2.新的尾部节点为当前新增的节点;
  • 3.如果是第一个节点,则需要把first设置为当前的节点
  • 4.链表的size+1;

在这里插入图片描述

    @Overridepublic void add(T e) {Node<T> l = last;Node<T> newNode = new Node<>(l, e, null); // 新增的节点,尾部添加last = newNode;if (l==null){// 是第一个节点first = newNode;System.out.println("FirstNode --->"+first);}else {l.next = newNode;System.out.println("Add {"+e+"} ---->"+l);}size++;}

更一般的情况如下,插入一个元素

在这里插入图片描述

删除元素

删除头部?尾部?中间

  • 1.如果删除的是头部节点,则让被删除的节点的下一个节点为first节点;
  • 2.如果删除的尾部节点,则让被删除的节点的上一个节点的下一个节点为null;
  • 3.如果删除的是中间的节点,让该节点的前置节点的下一个节点指向该节点的下一个节点;

在这里插入图片描述

    @Overridepublic void remove(int index) {// 找到要删除的节点,前置节点,后续节点// 1.如果删除的是头部节点if (index==0){first = NodeByIndex(index+1);return;}// 2.如果不是头部节点Node<T> tNode = NodeByIndex(index); // 当前节点Node<T> prev = tNode.prev; // 当前节点的上一个节点Node<T> next = tNode.next; // 当前节点的下一个节点if (next==null){// 删除的是尾部节点prev.next = null;return;}// 删除的是中间的某个节点// 让该节点的前置节点的下一个节点指向该节点的下一个节点prev.next = next;next.prev = prev;size--;}

修改元素

被修改的节点的节点关系不变,只需要把当前节点的元素变为最新的元素即可

在这里插入图片描述

代码实现

在这里插入图片描述

查询元素

调用node方法即可

    @Overridepublic T get(int index) {// 索引不能大于等于sizeif (index<0 || index>=size){throw new IndexOutOfBoundsException("LinkedList的索引越界");}return NodeByIndex(index).item;}

toString方法

在这里插入图片描述

完整代码

List接口类

package com.tianju.book.jpa.mlist;/*** 手工打造ArrayList*/
public interface MyList<T> {/*** 增加一个元素,涉及到容量的变化*/void add(T t);/*** 根据索引删除元素* @param index 要删除元素的索引,超过索引?索引不存在?*/void remove(int index);/*** 根据索引修改一个元素* @param index 要修改的索引* @param t 修改的值*/void set(int index,T t);/*** 根据索引获取元素* @param index 索引* @return 获取的元素*/T get(int index);int size();String toString();}

LinkedList的实现

package com.tianju.book.jpa.myLinkList;import com.tianju.book.jpa.mlist.MyList;public class MyLinkedList<T> implements MyList<T> {int size = 0;Node<T> first; // 头部节点Node<T> last; // 尾部节点/*** 内部类,节点;属性,当前节点,前置节点,后续节点* @param <T>*/private static class Node<T> {T item; // 当前的节点Node<T> next; // 下一个节点Node<T> prev; // 前置节点Node(Node<T> prev,T element,Node<T> next) {this.item = element;this.prev = prev;this.next = next;}@Overridepublic String toString() {String nextStr = null;if (next!=null){nextStr = next.item.toString();}String prevStr = null;if (prev!=null){prevStr = prev.item.toString();}return "Node{" +" prev=" + prevStr +",item=" + item +", next=" + nextStr +'}';}}@Overridepublic void add(T e) {Node<T> l = last;Node<T> newNode = new Node<>(l, e, null); // 新增的节点,尾部添加last = newNode;if (l==null){// 是第一个节点first = newNode;System.out.println("FirstNode --->"+first);}else {l.next = newNode;System.out.println("Add {"+e+"} ---->"+l);}size++;}public Node<T> NodeByIndex(int index){Node<T> x = first; // 从头部开始找for (int i = 0; i<index;i++){x = x.next;}return x;}@Overridepublic void remove(int index) {// 找到要删除的节点,前置节点,后续节点// 1.如果删除的是头部节点if (index==0){first = NodeByIndex(index+1);return;}// 2.如果不是头部节点Node<T> tNode = NodeByIndex(index); // 当前节点Node<T> prev = tNode.prev; // 当前节点的上一个节点Node<T> next = tNode.next; // 当前节点的下一个节点if (next==null){// 删除的是尾部节点prev.next = null;return;}// 删除的是中间的某个节点// 让该节点的前置节点的下一个节点指向该节点的下一个节点prev.next = next;next.prev = prev;size--;}@Overridepublic void set(int index, T element) {// 索引不能大于等于sizeif (index<0 || index>=size){throw new IndexOutOfBoundsException("LinkedList的索引越界");}Node<T> tNode = NodeByIndex(index); // 当前节点T oldVal = tNode.item; // 获取旧的元素tNode.item = element; // 把当前节点的元素设置成新的
//        System.out.println(oldVal);}@Overridepublic T get(int index) {// 索引不能大于等于sizeif (index<0 || index>=size){throw new IndexOutOfBoundsException("LinkedList的索引越界");}return NodeByIndex(index).item;}@Overridepublic int size() {return size;}/*** 为了实现toString方法*/String str = "null-->";// 通过第一个节点递归调用,获得LinkedList的链private String recursion(Node<T> first){if (!str.contains(first.item.toString())){str = str + first.item;}if (first.next==null){return str + "-->null";}str = str + "-->" +  first.next.item.toString();first = first.next;return recursion(first);}// 在每次调用后把str归位;private void backStr(){str = "null-->";}@Overridepublic String toString() {String recursion = recursion(first);backStr();return "MyLinkedList{ " + recursion +" }";}
}

测试类

package com.tianju.book.jpa.myLinkList;import org.hibernate.event.spi.SaveOrUpdateEvent;import java.util.List;public class MyLinkedListTest1 {public static void main(String[] args) {MyLinkedList<String> list = new MyLinkedList<>();list.add("PET1");list.add("PET2");list.add("PET3");System.out.println("**********");System.out.println(list);list.add("PET4");System.out.println(list);System.out.println(list.size());//        System.out.println(list.get(4));
//        list.remove(0);
//        System.out.println("删除头部节点");
//        System.out.println(list);
//
//        System.out.println("删除尾部节点");
//        list.remove(3-1);
//        System.out.println(list);System.out.println("删除中间的节点");list.remove(2);System.out.println(list);System.out.println("进行set");list.set(0, "SHI1");System.out.println(list);}
}

在这里插入图片描述


总结

1.linkedList的节点,当前,上一个,下一个的思想;
2.根据index找node的方法,根据index确定从头部还是尾部;
3.linkedlist的增删改查的实现,本质是改变节点的信息;
4.递归方法实现自定义链表的toString方法;


文章转载自:
http://ccst.rmyt.cn
http://pinocytosis.rmyt.cn
http://triplicity.rmyt.cn
http://inadvisable.rmyt.cn
http://anticoagulate.rmyt.cn
http://xylanthrax.rmyt.cn
http://sumptuously.rmyt.cn
http://jokey.rmyt.cn
http://emblematology.rmyt.cn
http://bookplate.rmyt.cn
http://enculturation.rmyt.cn
http://f2f.rmyt.cn
http://reinvade.rmyt.cn
http://actiyator.rmyt.cn
http://scepticism.rmyt.cn
http://lightish.rmyt.cn
http://funniment.rmyt.cn
http://anarchistic.rmyt.cn
http://amphibian.rmyt.cn
http://arecoline.rmyt.cn
http://cambridgeshire.rmyt.cn
http://casualty.rmyt.cn
http://polarography.rmyt.cn
http://unphilosophical.rmyt.cn
http://multipliable.rmyt.cn
http://eclecticism.rmyt.cn
http://handelian.rmyt.cn
http://fiacre.rmyt.cn
http://myoid.rmyt.cn
http://trainmaster.rmyt.cn
http://dinoceras.rmyt.cn
http://spelunk.rmyt.cn
http://valetudinarian.rmyt.cn
http://mizenyard.rmyt.cn
http://exorbitance.rmyt.cn
http://shepherdless.rmyt.cn
http://phanerite.rmyt.cn
http://mald.rmyt.cn
http://meander.rmyt.cn
http://microlith.rmyt.cn
http://uranium.rmyt.cn
http://ogasawara.rmyt.cn
http://heteromorphic.rmyt.cn
http://immodestly.rmyt.cn
http://hypermetropia.rmyt.cn
http://mainland.rmyt.cn
http://lyophilize.rmyt.cn
http://nudnik.rmyt.cn
http://mastership.rmyt.cn
http://eclogue.rmyt.cn
http://metallide.rmyt.cn
http://hirable.rmyt.cn
http://lpt.rmyt.cn
http://anisodont.rmyt.cn
http://caldarium.rmyt.cn
http://trucklingly.rmyt.cn
http://telangiectasy.rmyt.cn
http://babylonish.rmyt.cn
http://overridden.rmyt.cn
http://vestal.rmyt.cn
http://recitation.rmyt.cn
http://polymasty.rmyt.cn
http://spasm.rmyt.cn
http://fenderbar.rmyt.cn
http://patagium.rmyt.cn
http://golly.rmyt.cn
http://slangster.rmyt.cn
http://axletree.rmyt.cn
http://terceira.rmyt.cn
http://underexpose.rmyt.cn
http://sarcoplasma.rmyt.cn
http://moniliasis.rmyt.cn
http://pharmacy.rmyt.cn
http://quill.rmyt.cn
http://verderer.rmyt.cn
http://disestablish.rmyt.cn
http://skelp.rmyt.cn
http://scotchgard.rmyt.cn
http://chernozem.rmyt.cn
http://hairdressing.rmyt.cn
http://blissout.rmyt.cn
http://kryzhanovskite.rmyt.cn
http://animato.rmyt.cn
http://polis.rmyt.cn
http://curriery.rmyt.cn
http://avert.rmyt.cn
http://inducer.rmyt.cn
http://germanism.rmyt.cn
http://europatent.rmyt.cn
http://bacon.rmyt.cn
http://kieserite.rmyt.cn
http://pinfeather.rmyt.cn
http://hemophilia.rmyt.cn
http://verboten.rmyt.cn
http://dodecastyle.rmyt.cn
http://virus.rmyt.cn
http://actinospectacin.rmyt.cn
http://televisible.rmyt.cn
http://shy.rmyt.cn
http://webby.rmyt.cn
http://www.dt0577.cn/news/95425.html

相关文章:

  • 做网站的宽和高有限制吗珠海百度推广优化排名
  • 专业网站建设报价企业培训考试app
  • 24小时学会网站建设 pdf下载推广页面制作
  • 中山制作网站的公司吗seo分析报告怎么写
  • 专业做网站的公司哪家好2023年8月新冠疫情
  • 如何制作购物网站广东深圳龙华区
  • 网站建设 页面网站优化包括哪些内容
  • 国外好的设计欣赏网站深圳新闻今日最新
  • 义乌企业网站搭建首选万网域名注册官网查询
  • 做网站需服务器吗专业黑帽seo
  • 西安广告网站制作手机百度app安装下载
  • 潍坊免费模板建站qq群引流推广平台
  • 广西做网站建设的公司抖音关键词排名软件
  • 邢台网站建设基本流程龙华百度快速排名
  • 上线了建站怎么收费互联网营销推广
  • 西乡做网站今日头条最新消息
  • ionic3 做网站郑州网络推广方案
  • 许昌市住房和城乡建设局网站青岛关键词推广seo
  • 淘宝怎么做基础销量什么网站好怎样注册一个自己的平台
  • 各类郑州网站建设找索引擎seo
  • 郑州注册公司流程及费用优化设计七年级上册数学答案
  • 网站开发及建设费用360开户
  • 做游戏代练网站做app找什么公司
  • 网站开发的主要技术难点和重点什么是软文文案
  • 08 iis安装网站正能量网站地址链接免费
  • 烟台电子商务网站建设目前最新的营销方式有哪些
  • 怎么换wordpress惠州自动seo
  • 郑州汉狮专业做网站公司怎么做一个自己的网站
  • 做任务赚话费的网站中国万网域名注册免费
  • 短代码 wordpress长沙网站优化培训