链表涉及到指针了,这里我还不了解java里对指针的隐藏,又由于以前学过C++里的指针,二者混淆,导致一开始非常蒙,出了很多问题,当然后来随着边写边查,基本都解决了。
顺便学习了一下java里的泛型

//链表是一种“链式存储”的线性表,所有元素的内存地址不一定是连续的,在结构上已经完全不是数组了
//普通线性表有个大缺点,可能会造成内存空间的浪费,有些位置不存元素时也占用内存
//那么能不能用到多少就申请多少内存呢??  所以链表出现了//在定义链表类时,一般在定义链表大类中定义一个子类结点类
//链表在结构上,是由头结点和结点组成的,头结点存储指向第一个结点的地址,这里头结点其实就是个指针变量
//链表的大部分接口和线性表一致,但是实现方法不同,因此不能直接继承//顺带一提,java中类 A b=a;b改变a也会改变,二者指向同一块内存
public class LinkedListZH<E> {public static final  int ELEMENT_NOT_FOUND = -1;private int size;//定义全局变量(不在函数里的)不初始化默认初始值为0,局部变量则初始值随机private Node<E> headNode;//什么找到index为2的元素只需要两次headnode=headnode.next???//为什么老师的headNode就是第一个结点(除了所谓头结点)???//把headNode想象成单纯一个指向第一个结点的指针就通了!!!,也就是说有第一个结点时headNode就是第一个节点,没有第一个结点时,//headNode为null,但是具体原理在java里我依然没整明白,难道说headNode这个名本身代表的就是一个地址,所以//所以插入第一个元素时,headNode直接 =new Node<>(element,headNode(这时为null))就代表headNode就指向了第一个结点,也意味着在java里headnode就是第一个结点的引用?//如果这时候用headNode.next = node(element,headNode.next)就会报错"this.headNode" is null//是因为我们根本没设置headNode,headnode为null吗,导致空指针错误private static class Node<E> {E element;Node<E> next = null;//JAVA把指针淡化了,C中需要Node *p = next;next -> nextNode;,Java中只要next=nextNode就可以了public Node(E element, Node<E> next) {this.element = element;this.next = next;}}public void clear(){headNode = null;size = 0;}public void isEmptyPrint(){if (headNode == null){System.out.println("Empty");}else{System.out.println("Not Empty");}}//是否包含,一定记得看看有没有多余句子写到循环里了public void containsPrint(E element){Node<E> node = headNode;for(int i = 0;i < size ; i++){if (node.element == element){System.out.println("Contain");return;}node = node.next;}System.out.println("Not Contain");}//痛苦add,看前面,这里headNode。next和headNode的问题想了我快两个点public void add(int index , E element){if ( index == 0){Node<E> node = new Node<>(element,headNode);headNode = node;}else {Node<E> node = indexSearchNode(index - 1);node.next = new Node<>(element,node.next);}size++;}public void remove(int index){if (index == 0){headNode = headNode.next;}else{Node<E> pre = indexSearchNode(index - 1);pre.next = pre.next.next;}size--;//别忘了动size啊啊啊啊!!!!}public void add(E element){add(size,element);}//根据索引返回对应结点,注意返回值是Node<E>而不是E,该函数经常在别的函数内使用private Node<E> indexSearchNode (int index){Node<E> node = headNode;for(int i = 0; i < index ; i ++){node = node.next;}return node;}public String toString() {StringBuilder string = new StringBuilder();string.append("size=").append(size).append("  [");Node<E> node = headNode;for (int i = 0; i < size; i++) {if (i != 0) {string.append(", ");}string.append(node.element);node = node.next;}string.append("]");return string.toString();}}

2021-9-下旬 数据结构-线性表-链表-java代码实现(复习用)相关推荐

  1. 2021-9-下旬 数据结构-线性表-队列-java代码实现(复习用)

    话说...每次都用现成的类实现,是不是有点偷懒 //队列的本质也是线性表,特性为只在线性表首位端进行操作,为先进先出,和生活中排队的队列是一样的 //队列涉及到的操作主要是入队(enQueue)和出队 ...

  2. 2021-9-下旬 数据结构-线性表- 栈 -java代码实现(复习用)

    import java.util.ArrayList; import java.util.List; //栈的本质就是线性表,因为总在线性表的表尾端进行操作(出栈入栈),其重要特性为FILO先进后出 ...

  3. 2021 - 9 -下旬 数据结构- 线性表 -双端循环队列 - java实现

    //循环双端队列:Circle Double Ended Queue //本质是对动态数组的优化 //队头队尾都可以添加或删除元素 //相比于普通循环队列需要注意的点是在队头插入元素时的对front前 ...

  4. 2021 - 9 下旬 数据结构-线性表-循环队列-java实现代码

    //循环队列,本质就是用动态数组实现的,且出队入队时间复杂度均O(1)的队列 //相比普通队列,增设一个front指针,代表队头,代表下一个出队的元素 //循环队列的重点在于队头队尾的元素的下标的计算 ...

  5. 2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)

    public class DoubleLinkedListZH<E> {//调用方法参数是index的记得检测是否在合法范围(0~size-1)内,可以写一个arrangeCheck函数, ...

  6. 浅谈:数据结构之单链表,java代码演示单链表

    单链表 本文是观看尚硅谷韩老师视频学习总结,部分来源网络. 单链表介绍 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每 ...

  7. 2021-9-下旬 数据结构 - 线性表 - 循环链表 - java实现代码(复习用)

    public class CycleLinkedListZH<E> {public static final int ELEMENT_NOT_FOUND = -1;private int ...

  8. 线性链表java实现_线性表的Java实现--链式存储(双向链表)

    线性表的Java实现--链式存储(双向链表) 有了单向链表的基础,双向链表的实现就容易多了. ? 双向链表的一般情况: ? ? class="decoded" alt=" ...

  9. 数据结构——线性表(三)

    数据结构--线性表(三) 作者:黑衣侠客 一.线性表的定义 线性表,从名字来看,可以发现,是具有像线一样性质的表 线性表:零个或多个数据元素的有限序列. 首先,它是一个序列,也就是说,元素之间是有顺序 ...

最新文章

  1. 浅析2007年商业智能领域上演的收购大戏
  2. window.location.reload() 刷新页面时,如何不弹出提示框
  3. Python-图像的手绘效果
  4. spring MVC RequestMappingHandlerMapping解析
  5. linux系统sql语句报错_在linux下写的mysql无法插入,sql语句在复制中变'脏'了.
  6. html中字体响应式怎么写,css字体单位之间的区分以及字体响应式实现_html/css_WEB-ITnose...
  7. lambda 序列化_Lambda,会序列化吗?
  8. 对象文件格式分析工具: objdump, nm,ar
  9. REVERSE-PRACTICE-BUUCTF-11
  10. 正式环境docker部署hyperf_使用docker搭建hyperf环境连接mysql
  11. centos6.5 安装 OpenResty
  12. 剑指offer面试题42. 连续子数组的最大和(动态规划)
  13. C语言学习IDE和基本程序结构
  14. 用python来更改小伙伴的windows开机密码,不给10块不给开机
  15. 手把手带你撸一个校园APP(四):APP功能设计及主页面框架
  16. 很老很老的老偏方,小病一扫光
  17. Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme
  18. Dubbo服务调用过程流程图
  19. ndims matlab,MATLAB的size(),length(),ndims()函数
  20. Excel中快速填充产生连续的数字编号

热门文章

  1. html新人入门代码,HTML入门(示例代码)
  2. oracle dba_seg,Oracle DBA 应知应会 -- PGA自动管理
  3. C++ Primer 5th笔记(chap 15 OOP)继承中的类作用域
  4. 数学建模——层次分析法Python代码
  5. python—多线程之信号量
  6. 关于sendinput() inserted only 0 out of 2 python程序问题的解决
  7. 一个write和printf混用的例子
  8. CreateFileMapping 内存映射读写文件
  9. (3)段描述符,段选择子,LES指令
  10. 一次代码审计实战案例【思路流程】