JAVA基础——链表结构之双端链表
双端链表:双端链表与传统链表非常相似.只是新增了一个属性-即对最后一个链结点的引用
如上图所示:由于有着对最后一个链结点的直接引用.所以双端链表比传统链表在某些方面要方便.比如在尾部插入一个链结点.双端链表可以进行直接操作 但传统链表只能通过next节点循环找到最后链结点操作.所以双端链表适合制造队列. 下面的双端链表类.有几个重要方法. insertFirst(插入首链结点) 这个方法与上篇博文的单链表是基本一样的.唯一区别就是,多了个last引用的操作.正常由于last是指向尾链结点的引用,所以插入首链结点是与他无关的. 但当链结点为空(isEmpty())的时候,这会追加的链结点既是首链结点又是尾链结.所以需要将last指向它.
public void insertFirst(double dd) { Link newLink = new Link(dd); if(isEmpty()){ last = newLink; } newLink.next = first; first = newLink; }
insertLast(插入尾链结点) 插入尾部链结点也是与普通的理解基本一致,所以不多赘述.唯一也要注意的是链结点为空(isEmpty())的时候.需要将first指向该链结点.
public void insertLast(double dd) { Link newLink = new Link(dd); if(isEmpty()) { first = newLink; }else { last.next = newLink; } last = newLink; }
看下插入尾部链结点的引用指向:
deleteFirst(删除首部链结点) 这个需要注意的就是,如果仅剩下一个链结点.那么删除后last就应该指向null了.
public void deleteFirst() { first = first.next; if(first.next == null) { last = null; } }
最后这个代码如下:
FirstLastLink package com.dbstructor.oop3;
// 链结点类 class Link { public double dData; public Link next; public Link(double dd) { dData = dd; } public void displayLink() { System.out.print(dData + " "); } } // 双端链表类 class FirstLastList { public Link first; public Link last; public FirstLastList() { first = null; last = null; } public boolean isEmpty(){ return (first == null); } // 表头插入 public void insertFirst(double dd) { Link newLink = new Link(dd); if(isEmpty()){ last = newLink; } newLink.next = first; first = newLink; } // 表尾插入 public void insertLast(double dd) { Link newLink = new Link(dd); if(isEmpty()) { first = newLink; }else { last.next = newLink; } last = newLink; } // 删除表头 public void deleteFirst() { first = first.next; if(first.next == null) { last = null; } } public void displayList() { System.out.print("List (first--->last)"); Link current = first; while(current != null){ current.displayLink(); current = current.next; } System.out.println(); } } public class FirstLastApp { public static void main(String[] args) { FirstLastList theList = new FirstLastList(); // 插入链表头数据 theList.insertFirst(22); theList.insertFirst(44); theList.insertFirst(66); // 插入链表尾数据 theList.insertLast(11); theList.insertLast(33); theList.insertLast(55); theList.displayList(); // 删除表头数据 theList.deleteFirst(); theList.deleteFirst(); theList.displayList(); }
}
代码运行结果为:
List (first--->last)66.0 44.0 22.0 11.0 33.0 55.0 List (first--->last)22.0 11.0 33.0 55.0
链表的效率 这里顺便谈下链表和数组相比效率的优越性.在表头插入和删除的速度都很快,因为只需要改变一下引用所以花费O(1)的时间. 平均起来查找,删除和在指定节点后插入数据都需要搜索一半的链结点.需要O(N)次比较和数组一样.然由于链表删除插入的时候 不需要像数组那种元素的移动.所以效率还是要优于数组. 还有一点就是链表的内存可以随时的扩展内存.而数组的内存是一开始就固定好的.这样就会导致数组的效率和可用性大大下降.
JAVA基础——链表结构之双端链表的更多相关文章
- 队列(存储结构双端链表)--Java实现
/*用链表实现的队列--使用的是双端链表 *注意:空指针错误肯定是引用没有指向对象 * */ public class MyLinkedQueue { private MyFirstAndLastLi ...
- Java数据结构——用双端链表实现队列
//================================================= // File Name : LinkQueue_demo //---------------- ...
- Java单链表、双端链表、有序链表实现
单链表: insertFirst:在表头插入一个新的链接点,时间复杂度为O(1) deleteFirst:删除表头的链接点,时间复杂度为O(1) 有了这两个方法,就可以用单链表来实现一个栈了,见htt ...
- 《Java数据结构与算法》笔记-CH5-链表-3双端链表
/** * 双端链表的实现 */ class LinkA { public long dData; public LinkA next; public LinkA(long d) { dData = ...
- java实现双端链表
PS:双端链表(持有对最后一个节点的引用,允许表尾操作与表头操作等效的功能) public class DoubleLinkedList { //节点类 static class Node { pub ...
- 双端链表--Java实现
/*双端链表--比普通链表多了一个指向最后一个节点的引用 * 特点: 链表可以进行尾巴插入--输出顺序和输入顺序一致 * 但是不可以进行尾巴删除因为没有倒数第二节点的引用 * */ public cl ...
- java数据结构——单链表、双端链表、双向链表(Linked List)
1.继续学习单链表,终于摆脱数组的魔爪了,单链表分为数据域(前突)和引用域(指针域)(后继),还有一个头结点(就好比一辆火车,我们只关心火车头,不关心其它车厢,只需知晓车头顺藤摸瓜即可),头结点没有前 ...
- 循环双端链表(python)
# -*- coding: utf-8 -*- class Node(object): __slots__ = ('value', 'prev', 'next') # save memory def ...
- 自己动手实现java数据结构(四)双端队列
1.双端队列介绍 在介绍双端队列之前,我们需要先介绍队列的概念.和栈相对应,在许多算法设计中,需要一种"先进先出(First Input First Output)"的数据结构,因 ...
随机推荐
- 20170626_oracle_数据库设计
数据库设计的定义:规划数据库中数据对象以及之间关系的过程. 为什么进行数据库设计? 空间 完整性 程序开发 数据库设计前提知识: 范式: 1NF:第一范式 第一范式的目标是确保每列的原子性 如果每列都 ...
- backbone源代码注释(部分)
// Backbone.js 1.0.0 // (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. // Backbone may be freely ...
- python调用java程序--jpype
官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html ...
- C#面向过程项目之飞行棋
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 飞行棋V ...
- GG_Model 类库与数据库表对应建立实体类
3.4.GG_Model 类库与数据库表对应建立实体类 我这里不教大家写代码,直接用TT模板自动生成,省去写代码的麻烦. A. 三个文件MysqlDbhelper.ttinclude .mysqlMa ...
- 论文翻译-SELF TRAINING AUTONOMOUS DRIVING AGENT
文献地址 链接:https://pan.baidu.com/s/1gHrpnOf1FXLp9u8OJ2-oCg 提取码:y2w6 作者 Shashank Kotyan, Danilo Vasconce ...
- 51nod1298 圆与三角形
1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三 ...
- [转]MySQL存储过程
转自:http://www.cnblogs.com/exmyth/p/3303470.html 14.1.1 创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE ...
- dubbo与springmvc的简单使用
什么是Dubbo? dubbo是阿里巴巴公司开源的高性能优秀服务框架,通过高性能的RPC(远程服务调用)实现服务的输入输出功能,可以与spring框架无缝整合: 传统的架构所有的模块都在一台服务器上, ...
- 【C++】Item34.区分接口继承和实现继承
区分接口继承和实现继承 类包含的成员函数种类 1.静态函数 2.非静态函数 2.1 普通函数(非虚) non-virtual 2.2 虚函数 2.2.1 纯虚函数 pure-virtual 2.2.2 ...