java算法01 - 链表
1、链表
在Java中实现链表,每个节点都有一个值,然后把它链接到下一个节点。下面来看一下节点的实现
class Node<E> {
private E e;
private Node<E> next = null;
Node() {
}
Node(E e) {
this.e = e;
}
public void setNext(Node<E> next) {
this.next = next;
}
public Node<E> getNext() {
return next;
}
public E getValue() {
return e;
}
public void setValue(E e) {
this.e = e;
}
}
单链表
有了节点,来实现一个简单的单链表
**
* 单链表数据结构简单实现
*
* @author jade
*
*/
public class SingleLinkedList<E> { private Node<E> head = null; // 每个链表都存有一个空值的头结点。
private Node<E> tail = null; // 链表的最后一个结点,尾结点。
private int size = 0; // 当前链表中的节点数目。 /**
* 建立一个空链表(建立其头结点)。
*/
public SingleLinkedList() {
head = new Node<E>();
tail = head;
} /**
* 在链表的尾部插入数据
* @param e 待插入的数据
* @return
*/
public boolean add(E e) {
Node<E> node = new Node<E>(e); // 将要插入的值封装成一个节点。
tail.setNext(node); // 将待插入结点放到尾结点的下一个结点。
tail = tail.getNext(); // 将新增加的结点设为尾节点。
++size; // 链表大小增1。
return true;
} /**
*
* @param index 待插入的位置
* @param e 待插入的元素
* @return
*/
public boolean add(int index, E e) {
checkValidateIndex(index);
Node<E> newNode = new Node<E>(e);
Node preNode = null;
if (index > 0) {
preNode = getNode(index - 1);
}else{
preNode = head;
}
newNode.setNext(preNode.getNext());
preNode.setNext(newNode);
return true;
} /**
* 获取指定位置的结点的值
* @param index 欲获取值的结点的下标
* @return
*/
public E get(int index) {
checkValidateIndex(index);
Node<E> node = getNode(index);
return node.getValue();
} /**
* 删除指定位置的结点
* @param index 待删除结点的下标
* @return
*/
public boolean remove(int index) {
Node<E> curNode = null;
if (0 == index) {
curNode = head.getNext();
Node<E> nextNode = curNode.getNext();
head.setNext(nextNode);
} else {
checkValidateIndex(index);
curNode = getNode(index); // 获取待删除节点。
Node<E> preNode = getNode(index - 1); // 获取待删除节点的前一个结点。
preNode.setNext(curNode.getNext());
}
curNode.setNext(null); // 将待删除节点的下一结点置空。
return true;
} /**
* 设置指定位置结点的值。
* @param index 待设置值的结点的下标
* @param e
*/
public void set(int index, E e) {
checkValidateIndex(index);
Node<E> node = getNode(index);
node.setValue(e);
} /**
* 获取指定位置的结点
* @param index 获取结点的下标
*
*/
private Node<E> getNode(int index) {
checkValidateIndex(index);
Node<E> node = head;
for (int p = 0; p <= index; ++p) {
node = node.getNext();
}
return node;
} /**
* 验证下标值是否合法,非法时抛出异常。
* @param index 待验证的下标值
* @throws Exception
*
*/
private void checkValidateIndex(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("无效的下标:" + index);
}
} /**
* 获取链表的大小。
* @return
*/
public int size() {
return size;
}
堆栈和队列是两种特殊的线性表,下面来看一下他们的链式实现
栈(Stack)
java中的Stack是继承Vector的 :public class Stack<E> extends Vector<E>
下面来看一下Stack的简单实现:
class Stack {
Node top;
/**
* 栈顶元素
* @return
*/
public Node peek() {
if (top != null) {
return top;
}
return null;
}
/**
* 退栈
* @return
*/
public Node pop() {
if (top == null) {
return null;
} else {
Node temp = new Node(top.next);
top = top.next;
return temp;
}
}
/**
* 入栈
* @param n
*/
public void push(Node n) {
if (n != null) {
n.next = top;
top = n;
}
}
}
队列(queue)
下面基于链表实现一个阻塞对列
/**
* 基于链表实现的一个阻塞队列
*
* @author jade
*
*/
public class BlockingQueue {
private int capacity ; // 阻塞队列容量
private List queue = new LinkedList(); // 基于链表实现的一个阻塞队列 public BlockingQueue() {
this(Integer.MAX_VALUE);
} public BlockingQueue(int capacity) {
this.capacity = capacity;
} /**
* 入队列
*
* @param item
* @throws InterruptedException
*/
public synchronized void enqueue(Object item) throws InterruptedException {
while (this.queue.size() == this.capacity) {
wait();
}
if (this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
} /**
* 出队列
*
* @return
* @throws InterruptedException
*/
public synchronized Object dequeue() throws InterruptedException {
while (this.queue.size() == 0) {
wait();
}
if (this.queue.size() == this.capacity) {
notifyAll();
}
return this.queue.remove(0);
} }
java算法01 - 链表的更多相关文章
- [Java 教程 01] Hello,Java!
前言 从事编程已经有一段时间了,突然发现,Java作为我的第一编程语言,自己似乎对她并有一个系统的思想.当下Java依旧保持着超高的热度,新特性也不断出现,从当初学习的java6版本到最近刚出的jav ...
- Java 算法 概念汇总
编程面试的10大算法概念汇总 以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java ...
- Java 算法(一)贪心算法
Java 算法(一)贪心算法 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.贪心算法 什么是贪心算法?是指在对问题进行求 ...
- JAVA数据结构——单链表
链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...
- java算法--稀疏数组
数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...
- 面试 | Java 算法的 ACM 模式
(Java 算法的 ACM 模式) 前言 经常在 LeetCode 上用核心代码模式刷题的小伙伴突然用 ACM 模式可能会适应不过来,把时间花在输入输出上很浪费时间,因此本篇笔记对 Java 算法的 ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- JAVA算法系列 冒泡排序
java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
随机推荐
- 极其简单的VSCode C++环境配置
下载我打包的文件VSCode-cpp.7z.001 和 VSCode-cpp.7z.002,解压. 在系统环境变量中添加:你解压的路径\Project\.vscode\MinGW\bin. 打开你解压 ...
- Ubuntu 18.04 LTS 常用软件安装杂记
之前个人笔记本装的是 Linux Mint,用了一段时间但是体验不佳,所以打算换成 Ubuntu .作为一个 Linux 小白,当时配置一些软件环境费了不少时间.这次打算简单记录下,和大家分享一下我的 ...
- Docker跨主机网络联通之etcd实现
搭建ETCD集群 查看NODE1机器IP,并启动ETCD ubuntu@docker-node1:~$ ifconfig eth0 eth0: flags=4163<UP,BROADCAST,R ...
- IDLE清屏扩展
新建ClearWindows.py,复制以下代码: class ClearWindow: menudefs = [ ('options', [None, ('Clear Shell Window', ...
- Xiangqi(简单模拟)
4746: Xiangqi 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 15 测试通过:2 描述 Xiangqi i ...
- tensorboard
在控制台输入: C:\Users\sunli\Documents\name\src>tensorboard --logdir=./w
- python pyqt绘制直方图
# -*- coding: utf-8 -*- """ In this example we draw two different kinds of histogram. ...
- Lyrics来源
Lyre 里拉琴,古希腊语,在北欧流行至中世纪. Lyrics in sheet music. This is a homorhythmic (i.e., hymn-style) arrangem ...
- 一个SQL语句的优化(sqlserver)
最早的写法: WITH T AS ( end as Flag FROM YM WHERE Col_076 BETWEEN '2018-07-25' AND '2018-08-03' AND Col_4 ...
- Promise的两种处理异步的方式
单个异步处理: let usedMemoryPromise = fetchUsedMemeory(); usedMemoryPromise.then(data => {...}) functio ...