Java:数据结构-LinkedList和链表(2)

devtools/2024/10/22 8:04:18/

一 LinkedList

LinkedList的方法的实现

1.头插法

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;@Overridepublic void addFirst(int data) {ListNode node=new ListNode(data);ListNode cur=head;if (head==null) {head = last = cur;} else{node.next=head;head.prev=node;head=node;}}
}

2.尾插法

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;public void addLast(int data) {ListNode node=new ListNode(data);ListNode cur=head;if (head==null) {head = last = cur;} else{node.prev=last;last.next=node;last=node;}}
}

3.任意位置插入,第一个数据节点为0号下标

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}
public void addIndex(int index, int data) {ListNode node=new ListNode(data);int len=size();if(index<0 || index>len){return;}if(index==0){addFirst(data);}if(index==len){addLast(data);}ListNode cur=head;node.next=cur;node.prev=cur.prev;cur.prev.next=node;cur.prev=node;}

4.查找是否包含关键字key是否在链表当中

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;
public boolean contains(int key) {ListNode cur=head;while (head!=null){if(head.val==key){return true;}head=head.next;}return false;}

5.得到链表的长度

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;public int size() {ListNode cur=head;int count=0;while (head!=null){count++;head=head.next;}return count;}

6.打印链表 

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;public void display() {ListNode cur=head;while (head!=null){System.out.println(head.val+" ");head=head.next;}}

7.删除第一次出现关键字为key的节点

删除中间部分

删除头

并且考虑只有一项的情况下

删除尾

 

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;public void remove(int key) {ListNode cur=head;while (cur!=null){if(cur.val==key){if(cur==head){head=head.next;if(head!=null) {head.prev=null;}}else {if(cur.next==null){cur.prev.next=null;last=last.prev;}else {cur.prev.next=cur.next;cur.next.prev=cur.prev;}}return;}cur=cur.next;}}
}

8.删除所有值为key的节点

跟remove基本一样,删去return就行了,将整个链表检查一遍,删去全部的key

java">public void removeAllKey(int key) {ListNode cur=head;while (cur!=null){if(cur.val==key){if(cur==head){if(head!=null) {cur.next.prev = null;}}else {if(cur.next==null){cur.prev.next=null;last=last.prev;}else {cur.prev.next=cur.next;cur.next.prev=cur.prev;}}}cur=cur.next;}}

9.清空链表

 

java">public class MyLinkedList implements IList{static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val=val;}}public ListNode head;public ListNode last;public void clear() {ListNode cur=head;while (cur!=null){ListNode curN=cur.next;cur.prev=null;cur.next=null;cur=curN;}}
}

 

LinkedList方法的使用

java">public class Test {public static void main(String[] args) {LinkedList<Integer> linkedList=new LinkedList<>();List<Integer> list=new LinkedList();linkedList.add(1);linkedList.addFirst(3);linkedList.addLast(6);ArrayList<Integer> list1=new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);linkedList.addAll(list1);System.out.println(linkedList);linkedList.remove(2);linkedList.get(3);linkedList.set(2,6);linkedList.contains(5);linkedList.size();linkedList.clear();}

LinkedList的遍历

1.for循环遍历

java">public class Test {public static void main(String[] args) {LinkedList<Integer> linkedList=new LinkedList<>();linkedList.add(1);linkedList.addFirst(3);linkedList.addLast(6);for (int i = 0; i < linkedList.size(); i++) {System.out.println(linkedList.get(i)+" ");}}

2.foreach遍历

java">public class Test {public static void main(String[] args) {LinkedList<Integer> linkedList=new LinkedList<>();linkedList.add(1);linkedList.addFirst(3);linkedList.addLast(6);
for (Integer x:linkedList) {System.out.print(x+" ");}}
}

3.迭代器

Iterator

java">public class Test {public static void main(String[] args) {LinkedList<Integer> linkedList=new LinkedList<>();linkedList.add(1);linkedList.addFirst(3);linkedList.addLast(6);Iterator<Integer> iterator=linkedList.iterator();while (iterator.hasNext()){System.out.print(iterator.next());}

 ListIterator

1.按顺序打印
java">public class Test {public static void main(String[] args) {LinkedList<Integer> linkedList=new LinkedList<>();linkedList.add(1);linkedList.addFirst(3);linkedList.addLast(6);ListIterator<Integer> it=linkedList.listIterator();while (it.hasNext()){System.out.println(it.next()+" ");}
2.逆序打印
java">public class Test {public static void main(String[] args) {LinkedList<Integer> linkedList=new LinkedList<>();linkedList.add(1);linkedList.addFirst(3);linkedList.addLast(6);ListIterator<Integer> it1=linkedList.listIterator();while (it1.hasPrevious()){System.out.println(it1.previous()+" ");}
}

注: ListIterator可以当作迭代器的原因是,它是Iterator的子类,专门用来打印List类的。

ArrayList和LinkedList的区别 

当你进行查找时,我建议你选择ArrayList,因为LinkedList访问任意元素需要从头或尾遍历链表,时间复杂度为 O(n),ArrayList可以通过索引直接访问任意元素,时间复杂度是 O(1)。

当我们经常使用插入等功能,可以使用LinkedList,如果在末尾插入或删除元素,效率较高(时间复杂度 O(1)),ArrayList需要移动大量元素,因此效率较低(时间复杂度 O(n))。

希望能对大家有所帮助!!!!

 


http://www.ppmy.cn/devtools/125543.html

相关文章

neovim ubuntu中WARNING No clipboard tool found

我在vnc远程的ubuntu中做个临时开发&#xff0c;发现neovim无法复制文字&#xff0c;于是我:checkhealth查看了一下&#xff0c;测试结果如下&#xff1a; WARNING No clipboard tool found. Clipboard registers (" and "*) will not work.ADVICE::help clipboard …

flask项目框架搭建

目录结构 blueprints python包&#xff0c;蓝图文件&#xff0c;相当于路由组的概念,方便模块化开发 例如auth.py文件 from flask import Blueprint, render_templatebp Blueprint("auth", __name__, url_prefix"/auth")bp.route("/login") d…

R语言:ERGM指数随机图模型4:缺失值处理

文章目录 缺失数据可用的ERGM变量缺失数据 区分没有联系和不知道是否存在联系(即数据缺失Missing data)这两种情况是很重要的。前者是观察到的零,而后者是未被观察到的。我们不应该将这两种情况都编码为“0”。只要我们将数据识别为缺失数据,“ergm”包就能适当地识别并处…

Vue环境安装以及配置

这里写目录标题 前言一、前置要求1.安装Node.js2. 安装VScode 二、创建全局安装目录和缓存日志目录三、配置环境变量四、权限五、配置镜像六、vscode插件1. Vue-Offical2. Vue 3 Snippets3. Path Intellisense4. Auto Import5. Auto Close Tag6. Auto Rename Tag7.GitLens总结 …

基于PHP+uniapp的民宿预订系统的微信小程序设计与实现 ea9i3

目录 项目介绍技术栈和环境说明具体实现截图php技术介绍文件解析微信开发者工具HBuilderXuniapp开发技术简介解决的思路性能/安全/负载方面数据访问方式PHP核心代码部分展示代码目录结构解析系统测试详细视频演示源码获取 项目介绍 总体上看&#xff0c;Android的民宿预订系统…

<Linux> 线程安全

目录 文章目录 一、Linux线程互斥 1. 进程线程间的互斥相关背景概念 2. 互斥量mutex 3. 互斥量接口 初始化互斥量 动静态分配 销毁互斥量 互斥量加锁 互斥量解锁 4. 互斥量实现原理 5. 简单封装互斥量 二、可重入与线程安全 1. 概念 1.1 可重入 1.2 线程安全 2. 常见的线程不…

Linux系统和数据库常用的命令2

Linux系统和数据库常用的命令2 1、两台Linux机器ssh免密登录 client端登录server端需要免密&#xff0c;只需把公钥发送到server就可&#xff0c;会在server端生成一个authorized_keys文件 # 108机器上[rootclient ~]# ssh-keygen -t rsa // 非对称算法 Generating public/…

Nginx在Windows Server下的启动脚本

Nginx在Windows Server下的快捷运行脚本 使用时记得修改NGINX_DIR路径 ECHO OFF CHCP 65001 SET NGINX_DIRD:\software\Nginx\ color 0a TITLE Nginx Management GOTO MENU :MENU CLS ECHO. ECHO. * * * * Nginx Management * * * * * * * * * * * ECHO. * * EC…