Java 数据结构之双链表

package Linked;
public class Mylinked {
private Node first;//链表的第一个节点
private Node last;//链表的最后一个节点
private int size = 0;//节点的数量
public Node search(Object ele) {
Node current = this.first;
for (int i = 0; i < size; i++) {
if (!current.ele.equals(ele)) {
if (current.next == null) {
return null;
}
current=current.next;
}
}
return current;
}
public void remove(Object ele) {
//找到被删除的节点
Node current = this.first;
for (int i = 0; i < size; i++) {
if (!current.ele.equals(ele)) {
if (current.next == null) {
return;
}
current=current.next;
}
}
//删除节点
if(current==first){
this.first=current.next;
this.first.prev=null;
}else if(current==last){
this.last=current.prev;
this.last.next=null;
}else{
//把删除当前节点下一个节点作为删除节点上一个节点的下一个节点
current.prev.next=current.next;
//把删除节点的上一个节点作为删除节点的下一个节点的上一个节点
current.next.prev=current.next;
}
size--;
}
public void addFirst(Object ele) {
Node node = new Node(ele);//需要保存的节点对象
if (size == 0) {//当链表中没有节点的时候
this.first = node;
this.last = node;
} else {
node.next = this.first;//把之前的第一个节点作为新增的第一个节点的下一个节点
this.first.prev = node;//把新增节点作为第一个节点的上一个节点
this.last = node;//把新增节点作为第一个节点
}
size++;
}
public void addLast(Object ele) {//在最后一个节点插入数据
Node node = new Node(ele);//需要保存的节点对象
if (size == 0) {//当链表中没有节点的时候
this.first = node;
this.last = node;
} else {
this.last.next = node;//把新增的节点作为最后一个的下一个节点
node.prev = this.last;//把之前最后一个节点作为新增节点的上一个节点
this.last = node;//把新增的节点作为最后一个节点
}
size++;
}
public String toString() {//覆盖父类中的方法
if (size == 0) {
return "[ ]";
}
StringBuffer sb = new StringBuffer(size * 2 + 1);
Node current = this.first;//第一个节点
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(current.ele);
if (i != size - 1) {
sb.append(",");
} else {
sb.append("]");
}
current = current.next;//获取自己的下一个节点
}
return sb.toString();
}
class Node {
Node prev;//上一个节点对象
Node next;//下一个节点对象
Object ele;//当前节点中存储的数据
public Node(Object ele) {
this.ele = ele;
}
}
}
package Linked;
public class MylinkedDemo {
public static void main(String[] args) {
Mylinked list=new Mylinked();
list.addFirst("a");
list.addLast("b");
list.addLast("c");
list.addLast("d");
list.addLast("e");
System.out.println(list);
list.remove("c");
System.out.println(list);
}
}

Java 数据结构之双链表的更多相关文章
- Java数据结构和算法 - 链表
Q: 为什么要引入链表的概念?它是解决什么问题的? A: 数组作为数据存储结构有一定的缺陷,在无序数组中,搜索是低效的:而在有序数组中,插入效率又很低:不管在哪一个数组中删除效率都很低:况且一个数组创 ...
- java 数据结构与算法---链表
原理来自百度百科 一.链表的定义 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运 ...
- Java数据结构——用双端链表实现队列
//================================================= // File Name : LinkQueue_demo //---------------- ...
- java数据结构之三叉链表示的二叉树
三叉链表示的二叉树定义所畏的三叉链表示是指二叉树由指向左孩子结点.右孩子结点.父亲结点[三叉]的引用(指针)数据和数据组成. package datastructure.tree.btree; ...
- 图解Java数据结构之环形链表
本篇文章介绍数据结构中的环形链表. 介绍 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来.单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个 ...
- Java数据结构之单链表
这篇文章主要讲解了通过java实现单链表的操作,一般我们开始学习链表的时候,都是使用C语言,C语言中我们可以通过结构体来定义节点,但是在Java中,我们没有结构体,我们使用的是通过类来定义我们所需要的 ...
- Java数据结构-03单链表(二)
在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法.下面我们开始写代码: 无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类) public ...
- golang数据结构之双链表
目录结构: doubleLink.go package link import ( "fmt" ) //HerosNode 链表节点 type HerosNode struct { ...
- 图解Java数据结构之单链表
本篇文章介绍数据结构中的单链表. 链表(Linked List)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...
随机推荐
- yii2史上最简单式安装教程,没有之一(转)
测试说明:按照文章下载文件,虽然是tgz文件,用winrar解压,在CMD中运行init.bat文件. 既然是安装Yii,我们先去官网下载一份Yii的高级模版,什么,你说打开页面乱七八糟的英文字母你看 ...
- selenium - 截取页面图片和截取某个元素的图
1.截取页面图片并保存 在测试过程中,是有必要截图,特别是遇到错误的时候进行截图. # coding:utf-8 from time import sleep from PIL import Imag ...
- 控制台执行CI方法
执行方法:进入到ci放入口文件目录 执行 php index.php 控制器 方法 #php index.php home index
- FPGA中计数器设计探索
FPGA中计数器设计探索,以计数器为32位为例: 第一种方式,直接定义32位计数器. reg [31:0]count; quartus ii 下的编译,资源消耗情况. 85C模型下的时钟频率. 0C模 ...
- 【转】Jmeter内存溢出处理方式记录
方法一: 使用jmeter进行压力测试时 遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="- Xmx204 ...
- java代码逆序输出再连篇
总结:思维方式关键 package com.dfd; import java.util.Scanner; //逆序输出数字 public class fdad { public static void ...
- Tair ldb(leveldb存储引擎)实现介绍
简介 tair 是淘宝自己开发的一个分布式 key/value 存储引擎. tair 分为持久化和非持久化两种使用方式. 非持久化的 tair 可以看成是一个分布式缓存. 持久化的 tair 将数据存 ...
- zk 06之:ZooKeeper命令、命令行工具及简单操作
常用命令ZooKeeper 支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 telnet 或 nc 向 ZooK ...
- MMU_段式映射
首先, 段式映射的示意图如下: 该例程有5个文件构成: head.s-------------入口程序 mmu.lds-----------连接文件 init.c---------------初始化文 ...
- MongoDB在Java下的增删查改
我们总不能一直使用cmd对数据库操作,数据库总是要在程序中使用的.今天来说一下怎么通过Java调用MongoDB. 学习一下最基本也是最常用的增删查改语句,这是使用数据库的基础. 注意事项: 1.要打 ...