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

《算法通关村第一关——链表青铜挑战笔记》

《算法通关村第一关——链表青铜挑战笔记》

Java如何构造出链表

概念

如何构造出链表,首先必须了解什么是链表!

单向链表就像一个铁链一样,元素之间相互链接,包含多个节点,每个节点有一个指向后继元素的next指针。表中最后一个元素的next指向null。

在这里插入图片描述

链表的核心是一个节点只能有一个后继节点,但不代表链表指向本节点的只有一个。

Java与C++不同没有了指针,只有引用,不用进行内存的回收,会使得代码的书写更加简单。

Java如何编写链表

先放代码

package AlgorithmFirst;public class LinkedNode {private int data;private LinkedNode next;public LinkedNode(int data){this.data = data;}/*** 获取数据* @return 数据值*/public int getData(){return this.data;}/*** 设置数据的值* @param data 数据*/public void setData(int data){this.data = data;}/*** 获取下一个节点* @return 当前节点的下一个几点*/public LinkedNode getNext(){return this.next;}/*** 设置下一个节点的值* @param next 下一个节点*/public void setNext(LinkedNode next){this.next = next;}/*** 获取链表长度* @param head 头节点* @return*/public static int getListLength(LinkedNode head){int length = 0 ;LinkedNode node = head;while(node != null){length ++ ;node = node.next;}return length;}/*** 缺省位置,直接在最后插入* @param head 头节点* @param insertNode 插入节点* @return 头节点*/public static LinkedNode insertNode(LinkedNode head,LinkedNode insertNode){int size = getListLength(head);// return insertNode(head,insertNode,size+1); 修改一下,以便insertNode后面的元素能够全部插入进来。int count = 1;LinkedNode temp = head;while(temp != null){if(count == size ){temp.next = insertNode;}temp = temp.next;count++;}return head;}/*** 指定位置插入* @param head 头节点* @param nodeInsert 插入节点* @param position 插入位置,从1开始* @return 返回头节点*/public static LinkedNode insertNode(LinkedNode head , LinkedNode nodeInsert, int position){if (head == null ){// 如果head == null 表示当前链表为空,可以直接返回当前节点,或者报异常,这里直接把它当作头节点。return nodeInsert;}// 已经存在的元素的个数int size = getListLength(head);if(position > size + 1 || position < 1 ){System.out.println("位置参数越界");return head;}// 表头插入if(position == 1 ){nodeInsert.next = head;// 这里可以直接 return nodeInserthead = nodeInsert;return head;}LinkedNode pNode = head;int count = 1;// 这里position 被上面的size限制住了,不用考虑pNode = nullwhile(count < position -1){pNode = pNode.next;count ++ ;}nodeInsert.next = pNode.next;pNode.next = nodeInsert;return head;}/*** 缺省参数的删除最后一个节点* @param head 链表头节点* @return 返回新链表头节点*/public static LinkedNode deleteNode(LinkedNode head){int size = getListLength(head);return deleteNode(head,size);}/*** 根据位置删除节点* @param head 链表头节点* @param position 位置从1开始,最大链表大小 超出不删除,返回原头节点。* @return 新链表头节点*/public static LinkedNode deleteNode(LinkedNode head , int position){if(head == null) {// 链表为空,无法删除return null ;}int size = getListLength(head);if(position > size || position < 1 ){System.out.println("输入参数有误" );return head;}if( position == 1){return head.next;}else{LinkedNode cur = head;int count = 1;while(count<position-1){cur = cur.next;count ++;}LinkedNode curNode = cur.next;cur.next = curNode.next;//上面两行可以简化成 : cur.next = cur.next.next}return head;}public static void  printLinkedList(LinkedNode head){int count = 0;while(head != null){System.out.println("第 "+ ++count +" 个:"+ head.data);head = head.next;}}public static void main(String[] args) {LinkedNode head = new LinkedNode(0);for(int i = 0 ; i<10 ; i++){head = LinkedNode.insertNode(head,new LinkedNode(i+1));}System.out.println("origin:");printLinkedList(head);head = deleteNode(head,3);System.out.println("delete the third ");printLinkedList(head);head = deleteNode(head);System.out.println("delete the last one");printLinkedList(head);head = insertNode(head,new LinkedNode(11));System.out.println("insert one from last");printLinkedList(head);head = insertNode(head,new LinkedNode(22222),1);System.out.println("insert to first");printLinkedList(head);}}

添加节点需要注意的点

链表无节点

如果开始链表无节点,那么就把插入的节点作为头节点返回

插入到头节点

注意一下插入进行的操作步骤,首先把插入节点的 next 等于 head , 然后再让head 等于 插入节点,然后返回。

插入到结尾

插入到结尾需要从head 遍历到结尾,然后用最后一个节点的next指向插入节点即可。

插入到中间

插入到中间,需要注意先通过遍历,找到要插入位置的前一个,然后插入节点的next等于前一个的next,而前一个的next指向插入节点。一定要注意顺序!

删除节点需要注意的

链表为空

直接返回

删除头节点

直接返回头节点的next 节点就好了。

删除中间节点、尾节点

首先要找到中间节点的前一个节点,让前一个节点的next指向自己的next的next就可以了。

近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。

在这里插入图片描述

也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

http://www.lryc.cn/news/195370.html

相关文章:

  • 【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练
  • IOS课程笔记[1-3] 第一个IOS应用
  • Flink的基于两阶段提交协议的事务数据汇实现
  • 树模型(三)决策树
  • vueday01——使用属性绑定+ref属性定位获取id
  • LeetCode 260. 只出现一次的数字 III:异或
  • 使用PyTorch解决多分类问题:构建、训练和评估深度学习模型
  • 基于nodejs+vue网课学习平台
  • 读书笔记:Effective C++ 2.0 版,条款13(初始化顺序==声明顺序)、条款14(基类有虚析构)
  • flutter开发实战-下拉刷新与上拉加载更多实现
  • 旧手机热点机改造成服务器方案
  • 网工实验笔记:策略路由PBR的应用场景
  • webrtc快速入门——使用 WebRTC 拍摄静止的照片
  • 预约按摩app软件开发定制足浴SPA上们服务小程序
  • jenkins出错与恢复
  • ssh免密登录的原理RSA非对称加密的理解
  • 【监督学习】基于合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)解决分类问题(Matlab代码实现)
  • 力扣每日一题41:缺失的第一个正数
  • OpenCV与mediapipe实践
  • 【css拾遗】粘性布局实现有滚动条的情况下,按钮固定在页面底部展示
  • git 创建并配置 GitHub 连接密钥
  • 使用Premiere、PhotoShop和Audition做视频特效
  • vueday01——动态参数
  • 双向链表C语言版本
  • visual studio安装时候修改共享组件、工具和SDK路径方法
  • Motorola IPMC761 使用边缘TPU加速神经网络
  • EM@直线的参数方程
  • day08-注册功能、前端登录注册页面复制、前端登录功能、前端注册功能
  • rust: function
  • 零代码编程:用ChatGPT批量下载谷歌podcast上的播客音频