链表学习--单链表-增删查实现
链表
- 在大多数情况下,我们将使用头结点(第一个结点)来表示整个列表。
- 如果我们想要获得第 i 个元素,我们必须从头结点逐个遍历。 我们按索引来访问元素平均要花费 O(N) 时间,其中 N 是链表的长度。
实现如下功能 :
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
代码如下:
一、定义单链表的节点
package com.leetCode.study.Demo_2019_8_8_Linked; /** * 单链表的定义 * @author liudongting * @date 2019/8/8 10:45 */ public class SinglyListNode { //val 是当前节点的值 int val; //next 是指向下一个节点的指针/引用 SinglyListNode next; //带参构造函数 SinglyListNode(int x) { val = x; } }
二、链表
package com.leetCode.study.Demo_2019_8_8_Linked; /** * @author liudongting * @date 2019/8/8 10:56 */ public class List { static SinglyListNode head; /** * * addAtTail(val) * 将值为 val 的节点追加到链表的最后一个元素。 */ public void addAtTail(int val){ SinglyListNode singlyListNode = new SinglyListNode(val); //如果头节点为空,添加到头节点 if(head == null){ head = singlyListNode; return; } //从头节点开始 SinglyListNode temp = head; //从头节点开始判断,是否有下一个节点,找到最后一个节点 while (temp.next != null){ temp = temp.next; } //最后一个节点的指针指向新加入的节点 temp.next = singlyListNode; } /** * 获取链表中第 index 个节点的值。如果索引无效,则返回-1。 * @param index */ public int get(int index){ int length =0 ; //从头节点开始 SinglyListNode temp = head; //如果结点不为空,判断该节点的索引是否和要求的索引一致。相同则返回,不同继续; while (temp != null) { if(length==index){ return temp.val; } length++; temp = temp.next; } return -1; } /** * 在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。 * @param val */ public void addAtHead(int val){ SinglyListNode singlyListNode = new SinglyListNode(val); //如果头节点为空,添加到头节点 if(head == null){ head = singlyListNode; return; } //创建临时节点,保存头节点的值 SinglyListNode temp = head; //新节点的值,给头结点 head=singlyListNode; //新的头结点的下一个元素指向原来的头结点、 head.next = temp; } /** * 在链表中的第 index 个节点之前添加值为 val 的节点。 * 如果 index 等于链表的长度,则该节点将附加到链表的末尾。 * 如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。 * * */ public void addAtIndex(int index,int val){ if(index<0){ addAtHead(val); return; } if(linkListLength()==index){ addAtTail(val); return; } if(index>linkListLength()){ return; } SinglyListNode singlyListNode = new SinglyListNode(val); int length =0 ; //从头节点开始 SinglyListNode temp = head; //如果结点不为空,判断该节点的索引是否和要求的索引一致。相同则返回,不同继续; while (temp != null) { if((length+1)==index){ //index 前一个节点的指针指向的节点,即index处的节点 SinglyListNode preNode = temp.next; //index 前一个节点的指针 指向 新的节点 temp.next = singlyListNode; //新节点的下一个指针指向 index节点 singlyListNode.next= preNode; return; } length++; temp = temp.next; } } /** * 获取链表的长度 * @return */ public int linkListLength() { int length = 0; //临时节点,从首节点开始 SinglyListNode temp = head; // 找到尾节点 while (temp != null) { length++; temp = temp.next; } return length; } /** * 如果索引 index 有效,则删除链表中的第 index 个节点。 * @param index */ public void deleteAtIndex(int index){ int length = 0; //临时节点,从首节点开始 SinglyListNode temp = head; if(index==length){ head=head.next; } // 找到尾节点 while (temp != null) { if((index-1)==length){ SinglyListNode indexNode =temp.next; SinglyListNode nextNode = indexNode.next; temp.next = nextNode; return; } length++; temp = temp.next; } } public static void main(String[] args) { List list = new List(); // 添加元素 list.addAtTail(2); //在头结点添加元素 list.addAtHead(3); //在指定位置添加元素 list.addAtIndex(1,4); //根据索引删除元素 list.deleteAtIndex(2); //获取链表的长度 list.linkListLength(); System.out.println("222"); System.out.println(" 获取链表的长度 list.linkListLength() : " +list.linkListLength()); System.out.println(" 获取链表的某个元素 list.get(1) : " + list.get(2)); } }
[github 获取更多源码] https://github.com/florarose/biji
欢迎关注公众号,查看更多内容 :
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
centos7 配置 jdk
1. 下载 JDK wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup- cookie" https://download.oracle.com/otn/java/jdk/8u221-b11/230deb18db3e4014bb8e3e8324f81b43/jdk-8u221-linux-x64.tar.gz提示错误: -bash: wget: command not foundyum -y install wget 2. 安装 创建安装目录 mkdir /usr/local/java/ 解压至安装目录 tar -zxvf jdk-8u221-linux-x64.tar.gz -C /usr/local/java/ 3. 设置环境变量 打开文件 > vim /etc/profile > 提示错误: -bash: vim: command not found > yum -y install vim* > :q 退出vim :q! ...
- 下一篇
一道78%的Java程序员搞不清的Spring bean面试题
熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton、prototype、request、session、global session。如下图是官方文档上的截图,感兴趣的朋友可以进去看看这五种分别有什么不同。今天要介绍的是这五种中的前两种,也是Spring最初提供的bean scope singleton 和 prototype。Spring官方文档介绍如下图: 单例bean与原型bean的区别 如果一个bean被声明为单例的时候,在处理多次请求的时候在Spring容器里只实例化出一个bean,后续的请求都公用这个对象,这个对象会保存在一个map里面。当有请求来的时候会先从缓存(map)里查看有没有,有的话直接使用这个对象,没有的话才实例化一个新的对象,所以这是个单例的。但是对于原型(prototype)bean来说当每次请求来的时候直接实例化新的bean,没有缓存以及从缓存查的过程。1.画图分析 2.源码分析生成bean时先判断单例的还是原型的 如果是单例的则先尝试从缓存里获取,没有在新创建 结论:单例的bean只有第一次创建新的bean 后面都会...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Red5直播服务器,属于Java语言的直播服务器