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)介绍 链表可分为三类: 单链表 双向链表 循环列表 下面具体分析三个链表的应用. 单链表 链表是有序的列表,它在内存中存储方式如下: 虽 ...
随机推荐
- 为什么 I2C(IIC)需要上拉电阻
源鑫问: I2C时钟线和数据线为什么要接上拉电阻? 因为 I2C 的 IO 是开漏的,所以需要上拉电阻. 延伸: 之前 hippo曾经说过有人将 IO 设置为 PP,可能会烧 IO. 之前以为 I2C ...
- merge into报错ORA-00926、ORA-38014
今天用ibatis写个插入操作,为了兼容修改想使用 merge into语句,以便重复插入时直接 update,具体语句如下: <insert id="wlf"> ME ...
- pmap命令 查看进程用了多少内存
pmap命令 查看进程用了多少内存 用法 pmap [ -x | -d ] [ -q ] pids ...
- sar 命令
sar 命令使用详解 1.使用sar命令查看网络流量(每两秒显示一次,共查看3次): [root@localhost ~]# sar -n DEV 2 3Linux 2.6.32-431.el6.x8 ...
- 机器人操作系统(ROS)教程22:ROS的3D可视化工具—rviz
rviz是ROS中的一个3D可视化工具,有了它就可以把你用代码建的机器人模型转化为可视的3D模型. 首先需要安装: rosdep install rviz 然后编译rviz: rosmake rviz ...
- 控制台执行CI方法
执行方法:进入到ci放入口文件目录 执行 php index.php 控制器 方法 #php index.php home index
- 模块的分类以及time与date time 模块 radom模块
1.标准库,或者内置模块,python解释器自带的,比如sys,os模块 2.开源模块,或者叫第三方模块,python就强大在这里. 3.自定义模块. 标准库: 1.时间模块time与datetime ...
- python开发线程:死锁和递归锁&信号量&定时器&线程queue&事件evevt
一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...
- 参数传递中编码问题(Get/Post 方式)(二)
form有2中方法把数据提交给服务器,get 和post ,分别说下吧.(一)get 提交1.首先说下客户端(浏览器)的form表单用get 方法是如何将数据编码后提交给服务器端的吧. 对于get 方 ...
- kali下安装go环境
1.安装go 下载安装包,命令:wget -c https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz 下载完后,解压到 /u ...