双向链表--Java实现
- /*双向链表特点:
- *1.每个节点含有两个引用,previos和next,支持向前或向后的遍历(除头节点)
- *2.缺点插入或删除的时候涉及到引用修改的比较多
- *注意:下面的双向链表其实也实现了双端链表
- *注意:在Java中多个引用可以指向同一个对象,也可以随时改变引用的指向
- * 关于修改引用细心一点就可以 引用A = 引用B 表示A引用指向B引用指向的对象
- *应用:利用双向链表可以实现双端队列
- * */
- public class MyDoubleLink {
- private Link first;
- private Link last;
- public boolean isEmpty(){
- return first == null;
- }
- public void insertFirst(int key){
- Link newLink = new Link(key);
- if(first == null){
- last = newLink;
- }
- else{
- first.previous = newLink;
- }
- newLink.next = first;//链未断可以指向同一个
- first = newLink;
- }
- public void insertLast(int key){
- Link newLink = new Link(key);
- if(first == null){
- first = newLink;
- }
- else{
- last.next = newLink;
- newLink.previous = last;
- }
- last = newLink;
- }
- //插入指定值的后边---其实是一种尾巴插入--此时链表非空才可以操作
- public boolean insertAfter(int key,int value){
- Link newLink = new Link(value);
- Link current = first;
- while(current.id != key){
- current = current.next;
- if(current == null){
- return false;
- }
- }
- if(current == last){//find it at last item
- newLink.next = null;
- last = newLink;
- }
- else{
- newLink.next = current.next;
- current.next.previous = newLink;
- }
- newLink.previous = current;
- current.next = newLink;
- return true;
- }
- public Link deleteFirst(){
- Link temp = first;
- if(first.next == null){
- last = null;
- }
- else{
- first.next.previous = null;
- }
- first = first.next;
- return temp;
- }
- public Link deleteLast(){
- Link temp = last;
- if(first.next == null){
- first = null;
- }
- else{
- last.previous.next = null;
- }
- last = last.previous;
- return temp;
- }
- //按照值进行删除--可能存在找不到的时候
- public Link delete(int key){
- Link current = first;
- while(current.id != key ){
- current = current.next;
- if(current == null){
- return null;
- }
- }
- if(current == first){//find it at first item并非只有一个节点
- first = current.next;
- }
- else{ //find it not first item
- current.previous.next = current.next;
- }
- if(current == last){ //find it at last item
- last = current.previous;
- }
- else{ //find it not last
- current.next.previous = current.previous;
- }
- return current;
- }
- public void diaplayFirstToLast(){
- System.out.println("first to last");
- Link current = first;
- while(current != null){
- System.out.print(current.id + " ");
- current = current.next;
- }
- System.out.println();
- }
- public void displayLastToFirst(){
- System.out.println("last to first");
- Link current = last;
- while(current != null){
- System.out.print(current.id + " ");
- current = current.previous;
- }
- System.out.println();
- }
- }
双向链表--Java实现的更多相关文章
- 线性链表的双向链表——java实现
.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为 ...
- 双向链表-java完全解析
原文:https://blog.csdn.net/nzfxx/article/details/51728516 "双向链表"-数据结构算法-之通俗易懂,完全解析 1.概念的引入 相 ...
- 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)
问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左 ...
- 双向链表JAVA代码
//双向链表类 publicclassDoubleLinkList{ //结点类 publicclassNode{ publicObject data; ...
- LRU hashMap(拉链) + 双向链表 java实现
//基于 hash (拉链法) + 双向链表,LRUcache //若改为开放寻址,线性探测法能更好使用cpuCache public class LRU { private class Node { ...
- 《剑指offer》面试题27 二叉搜索树与双向链表 Java版
(将BST改成排序的双向链表.) 我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列.如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单.关 ...
- 双向链表——Java实现
双向链表 链表是是一种重要的数据结构,有单链表和双向链表之分:本文我将重点阐述不带头结点的双向链表: 不带头结点的带链表 我将对双链表的增加和删除元素操作进行如下解析 1.增加元素(采用尾插法) (1 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- JAVA单向/双向链表的实现
一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...
随机推荐
- Linux下的定时任务 - Cron服务
最近搞咕自己的笔记系统,虽然现在是个人的使用,对于数据库的数据还是比较少,但是安全还是一个我必须注意的东西. (特别是前段时间中了比特币的病毒之后,更是让我关注了我的主机的安全的问题.) 今天的随记是 ...
- SSH复用代码最终版
web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="h ...
- uvalive 3708 Graveyard
https://vjudge.net/problem/UVALive-3708 题意: 一个长度为10000的圆环上放着n个雕塑,每个雕塑之间的距离均相等,即这个圆环被n个点均分.现在需要加入m个雕塑 ...
- 初学者---AngularJS详解
AngularJS 简介 AngularJs是一个用于设计动态web应用的结构框架.首先,它是一个框架,不是类库,提供一整套方案用于设计web应用.它不仅仅是一个javascript框架,因为它的核心 ...
- Spring c3p0连接池无法释放解决方案
通过c3p0配置连接池的时候,在进行压力测试的时候,日志出现了这样一个错误:Data source rejected establishment of connection, message from ...
- vim/network/ssh
一.编辑器--vim vi编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界面,vi是效率很高的文本编辑器.尽管在Linux上也有很多图形界面的编辑器可用,但vi在系 ...
- angular之$watch方法详解
在$apply方法中提到过脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. (1)$watch简介 在diges ...
- ASP.NET Core中如何调整HTTP请求大小的几种方式
一.前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值. 在ASP.NET Co ...
- spark与hive的集成
一:介绍 1.在spark编译时支持hive 2.默认的db 当Spark在编译的时候给定了hive的支持参数,但是没有配置和hive的集成,此时默认使用hive自带的元数据管理:Derby数据库. ...
- poj3468树状数组的区间更新,区间求和
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 47174 ...