Java单链表、双端链表、有序链表实现
Java单链表、双端链表、有序链表实现
- 标签:
- Java /
- 单链表 /
- 双端链表 /
- 有序链表
- 65040
单链表:
insertFirst:在表头插入一个新的链接点,时间复杂度为O(1)
deleteFirst:删除表头的链接点,时间复杂度为O(1)
有了这两个方法,就可以用单链表来实现一个栈了,见http://blog.csdn.net/a19881029/article/details/22579759
find:查找包含指定关键字的链接点,由于需要遍历查找,平均需要查找N/2次,即O(N)
remove:删除包含指定关键字的链接点,由于需要遍历查找,平均需要查找N/2次,即O(N)
- public class LinkedList {
- private class Data{
- private Object obj;
- private Data next = null;
- Data(Object obj){
- this.obj = obj;
- }
- }
- private Data first = null;
- public void insertFirst(Object obj){
- Data data = new Data(obj);
- data.next = first;
- first = data;
- }
- public Object deleteFirst() throws Exception{
- if(first == null)
- throw new Exception("empty!");
- Data temp = first;
- first = first.next;
- return temp.obj;
- }
- public Object find(Object obj) throws Exception{
- if(first == null)
- throw new Exception("LinkedList is empty!");
- Data cur = first;
- while(cur != null){
- if(cur.obj.equals(obj)){
- return cur.obj;
- }
- cur = cur.next;
- }
- return null;
- }
- public void remove(Object obj) throws Exception{
- if(first == null)
- throw new Exception("LinkedList is empty!");
- if(first.obj.equals(obj)){
- first = first.next;
- }else{
- Data pre = first;
- Data cur = first.next;
- while(cur != null){
- if(cur.obj.equals(obj)){
- pre.next = cur.next;
- }
- pre = cur;
- cur = cur.next;
- }
- }
- }
- public boolean isEmpty(){
- return (first == null);
- }
- public void display(){
- if(first == null)
- System.out.println("empty");
- Data cur = first;
- while(cur != null){
- System.out.print(cur.obj.toString() + " -> ");
- cur = cur.next;
- }
- System.out.print("\n");
- }
- public static void main(String[] args) throws Exception {
- LinkedList ll = new LinkedList();
- ll.insertFirst(4);
- ll.insertFirst(3);
- ll.insertFirst(2);
- ll.insertFirst(1);
- ll.display();
- ll.deleteFirst();
- ll.display();
- ll.remove(3);
- ll.display();
- System.out.println(ll.find(1));
- System.out.println(ll.find(4));
- }
- }
- 1 -> 2 -> 3 -> 4 ->
- 2 -> 3 -> 4 ->
- 2 -> 4 ->
- null
- 4
双端链表(不是双向链表):
与单向链表的不同之处在保存有对最后一个链接点的引用(last)
insertFirst:在表头插入一个新的链接点,时间复杂度O(1)
insertLast:在表尾插入一个新的链接点,时间复杂度O(1)
deleteFirst:删除表头的链接点,时间复杂度O(1)
deleteLast::删除表尾的链接点,由于只保存了表尾的链接点,而没有保存表尾的前一个链接点(这里就体现出双向链表的优势了),所以在删除表尾链接点时需要遍历以找到表尾链接点的前一个链接点,需查找N-1次,也就是O(N)
有了这几个方法就可以用双端链表来实现一个队列了,http://blog.csdn.net/a19881029/article/details/22654121
- public class FirstLastList {
- private class Data{
- private Object obj;
- private Data next = null;
- Data(Object obj){
- this.obj = obj;
- }
- }
- private Data first = null;
- private Data last = null;
- public void insertFirst(Object obj){
- Data data = new Data(obj);
- if(first == null)
- last = data;
- data.next = first;
- first = data;
- }
- public void insertLast(Object obj){
- Data data = new Data(obj);
- if(first == null){
- first = data;
- }else{
- last.next = data;
- }
- last = data;
- }
- public Object deleteFirst() throws Exception{
- if(first == null)
- throw new Exception("empty");
- Data temp = first;
- if(first.next == null)
- last = null;
- first = first.next;
- return temp.obj;
- }
- public void deleteLast() throws Exception{
- if(first == null)
- throw new Exception("empty");
- if(first.next == null){
- first = null;
- last = null;
- }else{
- Data temp = first;
- while(temp.next != null){
- if(temp.next == last){
- last = temp;
- last.next = null;
- break;
- }
- temp = temp.next;
- }
- }
- }
- public void display(){
- if(first == null)
- System.out.println("empty");
- Data cur = first;
- while(cur != null){
- System.out.print(cur.obj.toString() + " -> ");
- cur = cur.next;
- }
- System.out.print("\n");
- }
- public static void main(String[] args) throws Exception {
- FirstLastList fll = new FirstLastList();
- fll.insertFirst(2);
- fll.insertFirst(1);
- fll.display();
- fll.insertLast(3);
- fll.display();
- fll.deleteFirst();
- fll.display();
- fll.deleteLast();
- fll.display();
- }
- }
- 1 -> 2 ->
- 1 -> 2 -> 3 ->
- 2 -> 3 ->
- 2 ->
有序链表:链表中的数据按从小到大排列
- public class SortedList {
- private class Data{
- private Object obj;
- private Data next = null;
- Data(Object obj){
- this.obj = obj;
- }
- }
- private Data first = null;
- public void insert(Object obj){
- Data data = new Data(obj);
- Data pre = null;
- Data cur = first;
- while(cur != null && (Integer.valueOf(data.obj.toString())
- .intValue() > Integer.valueOf(cur.obj.toString())
- .intValue())){
- pre = cur;
- cur = cur.next;
- }
- if(pre == null)
- first = data;
- else
- pre.next = data;
- data.next = cur;
- }
- public Object deleteFirst() throws Exception{
- if(first == null)
- throw new Exception("empty!");
- Data temp = first;
- first = first.next;
- return temp.obj;
- }
- public void display(){
- if(first == null)
- System.out.println("empty");
- System.out.print("first -> last : ");
- Data cur = first;
- while(cur != null){
- System.out.print(cur.obj.toString() + " -> ");
- cur = cur.next;
- }
- System.out.print("\n");
- }
- public static void main(String[] args) throws Exception{
- SortedList sl = new SortedList();
- sl.insert(80);
- sl.insert(2);
- sl.insert(100);
- sl.display();
- System.out.println(sl.deleteFirst());
- sl.insert(33);
- sl.display();
- sl.insert(99);
- sl.display();
- }
- }
- first -> last : 2 -> 80 -> 100 ->
- 2
- first -> last : 33 -> 80 -> 100 ->
- first -> last : 33 -> 80 -> 99 -> 100 ->
表的插入和删除平均需要比较N/2次,即O(N),但是获取最小数据项只需O(1),因为其始终处于表头,对频繁操作最小数据项的应用,可以考虑使用有序链表实现,如:优先级队列
和数组相比,链表的优势在于长度不受限制,并且在进行插入和删除操作时,不需要移动数据项,故尽管某些操作的时间复杂度与数组想同,实际效率上还是比数组要高很多
劣势在于随机访问,无法像数组那样直接通过下标找到特定的数据项
转载于:https://www.cnblogs.com/xc1234/p/8611374.html
Java单链表、双端链表、有序链表实现相关推荐
- 将k个有序链表合并成一个有序链表
将k个有序链表合并成一个有序链表 这里以从小到大排序为例, 时间复杂度为O(nlgk). 特点:利用最小堆来完成k路归并 思路:取每个列表中的第一个元素,并将其放在最小堆中.与每个元素一起,必须跟踪从 ...
- python创建一个有序链表_Python实现单向有序链表(Singly linked list)
概念介绍 上一博文已经介绍了Python实现单向无序链表的实现方式,这篇博文来介绍Python如何实现单向有序链表.有序和无序仅仅指节点所包含的数据成员的大小排列顺序,有序指各个节点按照节点数据成员的 ...
- STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器
Stack是一种先进后出的数据结构,他只有一个出口 stack允许 新增元素.移除元素.取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为 Stack定义的完整列表 (双端 ...
- java无锁数据结构,无锁有序链表的实现
感谢同事[kevinlynx]在本站发表此文 无锁有序链表可以保证元素的唯一性,使其可用于哈希表的桶,甚至直接作为一个效率不那么高的map.普通链表的无锁实现相对简单点,因为插入元素可以在表头插,而有 ...
- 有序链表插入 java_Java 实现有序链表
有序链表: 按关键值排序. 删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置. 插入时须要比較O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1), 假设一个应用须 ...
- 【链表】两个无序链表合并成递增有序链表(利用原表空间)
思路: 1.排序 先将两个链表从小到大排序,调整成两个有序链表. 2.合并 使用两个工作指针PA和PB分别从两个表头开始循环. 当两个工作指针均非空时,如果PA->data大于PB->da ...
- 链表4:合并有序链表的3道题
看了这篇文章之后,你会发现LeetCode就是在造题. 一.造题 LeetCode21 和23又是逐步拔高的题目,刷完这两道题,你会发现第1669根本不用刷.为啥呢,我们先看要求: LeetCode2 ...
- 【小f的刷题笔记】(JS)链表 - 合并 k 个有序链表 LeetCode23 - 顺序合并暴力三种方法
[链表] 合并 k 个有序链表:
- java数据结构之双端队列ArrayDeque
这篇文章介绍java的数据结构之双端队列之ArrayDeque 1.ArrayDeque ArrayDeque是一个双端数组,既可以当做栈使用,也可以当做队列使用. ArrayDeque有两个指针he ...
- 2023苹果内核JAVA原生影视双端修改版源码+附安装教程
正文: 完整标题: 开发环境 ios:oc 安卓:Android Stodio! 对接影视飞飞cms后台 原生并非h5 不管体验感觉还是使用h5都是无法对比的. 天镶之别. 原生的app可使用解析 原 ...
最新文章
- NRF52810能不能替代NRF52832
- css提取页面元素唯一性_一日一技:爬虫如何正确从网页中提取伪元素?
- 菜单工具栏wxPython菜单与工具栏基础示例
- Django打造大型企业官网-项目部署
- SQL Server2008 表旋转(pivot)技术
- 蔡琴之《祈祷》纪念今日沪指逆境大涨
- C++基础:: struct vs class
- 【重点:BFS】LeetCode 407. Trapping Rain Water II
- 谈谈JS中的函数节流
- Android 存储学习之SQLite数据库的基本操作 (使用API操作数据库)
- 73本免费的、语言无关的优秀的编程书籍
- C语言system函数使用
- 朴素贝叶斯模型进行垃圾邮件分类
- All-Pay Contests(博弈论+机制设计) 论文阅读笔记
- Android使用SubsamplingScaleImageView完美查看超大图片
- 产业互联网将不再只是虚无缥缈,触不可及的空中楼阁
- 计算机10秒后重新启动,电脑主机开机几秒或者几十秒自动断电关机
- 计算机打字键盘怎么控制,键盘是怎样分区的,打字时每个手指分别可控制哪些键...
- IOS实用功能-陀螺仪
- python词云图片生成
热门文章
- 微擎乐慧云智慧农场源码V1.0.1
- Atlantis Lite蓝色精品后台管理系统模板
- 小程序 | 使用GitHub创建图床存储器解决CDN配额耗尽问题
- 网狐app端获取服务器信息,获取服务器信息 网狐客户端
- 查看mysql 更新命令_MySQL UPDATE 查询
- 修复版ZFAKA发卡系统源码 自适应PC+手机端
- Docker拉取RabbitMQ镜像运行启动
- ArrayList 与linkedlist区别
- 通过代码生成机制实现强类型编程-CodeSimth版
- jQuery:无限循环两个或者多个事件 click / toggle between two functions