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 和 ...
随机推荐
- SQL中IN与EXISTS的区别
1.IN子句中的子查询只能返回一个字段,不允许返回多个字段,而EXISTS可以返回多个字段 2.IN返回的是某字段的值,而EXISTS返回的则是True或False,EXISTS子句存在符合条件的结果 ...
- MemoryCache
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.caching.memorycache?view=netframework-4.8 ...
- Zynq启动流程
前言 Zynq启动流程和ARM处理器类似,PS部分是启动和配置过程的主设备,芯片引导必须由处理器驱动,系统上电复位后会读取设备模式引脚来决定从什么设备启动芯片.如下表Boot Devices条目所示, ...
- MySQL自定义函数递归查询
用于递归查找Id(通过parentId关联)参数为int 类型的值: CREATE DEFINER=`root`@`%` FUNCTION `getChildList`(rootId INT) RET ...
- HTML5外包注意事项-开发HTML5游戏的九大坑与解决方法剖析
随着移动社区兴起,势必带动HTML5的革命.未来一两年内,HTML5移动游戏必将呈现大爆发趋势. 以下是整理的HTML5游戏研发.市场趋势以及渠道布局和技术解决方案的内容.希望大家能从本文中找到对HT ...
- grep 从文件内容中查找
grep -rin [查找目标] [查找范围] 例子:在当前目录下的文件内查找test字符串 grep -rin test ./
- F1赛道 - Bahrain International Circuit | 巴林国际赛道
刚看完F1巴林站比赛,23点到1点,整整两个小时,比赛相当精彩. 从排位赛结果看,法拉利似乎肯定包揽1-2名,可惜天公不作美,今晚风大.沙多:vettel自己失误,鼻翼掉了,还在被汉密尔顿超车的时候自 ...
- ubuntu1604 golang环境
copy来的,这里记录一下 1. 升级系统: sudo apt-get upgrade 2. 安装docker 下载docker-ce: https://download.docker.com/lin ...
- application.xml中配置文件properties导入
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.Prop ...
- 微信小程序分包跳转主包页面
由于公司项目比较多,我们事业部的微信小程序就在一个分包里.那分包页面要回到主包的首页,该怎么跳转呢,有以下两种方法 wx.switchTab(Object object) 跳转到 tabBar 页面, ...