SingleLinkedList独立实现,无任何依赖包

现在对Java原生数据结构特感兴趣,于是决定自己动手实现一些类,比如这个List类,在熟习了单链表和双链表的数据结构之后,终于实现了,代码如下:

源码SingleLinkedList.java

package hk.inso.service;

/**

* Created by IntelliJ IDEA.

* Date: 8/10/15 6:09 PM

* Author: Richard

*/

public class SingleLinkedList<E> {

private static class Node<E> {

private element;

private Node next;

public Node(E element) {

//constructor with args

this.element = element;

}

public Node() {

//constructor without args

}

@Override

public String toString() {

return element.toString();

}

}

private Node first;

private Node last;

/**

* 添加元素到链表头部

@param element

     */

public void add(E element) {

Node<E> node = new Node<E>(element);

linkFirst(node);

}

/**

* 添加元素到链表尾部

@param element

     */

public void addLast(E element) {

Node<E> node = new Node<E>(element);

linkLast(node);

}

/**

* 根据索引移除元素

@param index

     */

public void remove(int index) {

if (index == 0) {

unlinkFirst();

}

else{

Node node = getNode(index);

unlink(node);

}

}

/**

* 移除链表中最后一个元素

*/

public void removeLast() {

unlinkLast();

}

/**

* 将元素插入指定链表索引为止

@param index

     @param element

     */

public void insert(int index, E element) {

Node<E> node1 = new Node<E>(element);

if(index == 0) {

linkFirst(node1);

else {

Node node2 = getNode(index);

link(node1, node2);

}

}

/**

* 获取某个元素

@param index

     @return

     */

public E get(int index) {

Node<E> node = getNode(index);

E element = node.element;

return element;

}

/**

* 统计链表里面所有元素的个数

@return 总的元素的个数

*/

public int size() {

int count = 0;

Node node = first;

while (node != null) {

count++;

node = node.next;

}

return count;

}

/**

* toString方法实现

@return

     */

@Override

public String toString() {

Node node = first;

StringBuilder stringBuilder = new StringBuilder();

if(node == null) {

return "{}";

}

while (node != null) {

stringBuilder.append("[" + node.element.toString() +"],");

node = node.next;

}

String result = stringBuilder.toString();

int index = result.lastIndexOf(",");

return result.substring(0, index);

}

/**

* 插入结点到链表中间

* 插入前

* node2->node3->node4

* 插入后

* node2->node1->node3->node4

@param node1 要插入的结点

@param node2 插入结点位置结点

*/

private void link(Node node1, Node node2) {

node1.next = node2;

Node prevNode = getPrevNode(node2);

prevNode.next = node1;

}

/**

* 插入结点到链表首部

@param node

     */

private void linkFirst(Node node) {

if(first == null || last == null) {

first last = node;

else {

node.next first;

first = node;

}

}

/**

* 插入结点到链表尾部

@param node

     */

private void linkLast(Node node) {

last.next = node;

last = node;

}

/**

* 从链表中间移除当前结点

@param node

     */

private void unlink(Node node) {

Node prevNode = getPrevNode(node);

prevNode.next = node.next;

}

/**

* 移除头部的结点

*/

private void unlinkFirst() {

first first.next;

}

/**

* 移除尾部的结点

*/

private void unlinkLast() {

Node prevNode = getPrevNode(last);

prevNode.next null;

last = prevNode;

}

/**

* 寻找当前结点的前一个结点

@param node 当前结点

@return

     */

private Node getPrevNode(Node node) {

//这里多走了一步

// Node nodeItr = first.next;

Node nodeItr = first;

Node prevNode = new Node();

while (!nodeItr.equals(node)) {

prevNode = nodeItr;

nodeItr = nodeItr.next;

}

return prevNode;

}

/**

* 根据索引查找链表中得数据

@param index

     @return 链表结点

*/

private Node getNode(int index) {

Node node = first;

Node currentNode = new Node();

if (index == 0) {

//continue

}

if (index >= size()) {

throw new IndexOutOfBoundsException(errMessage(index));

}

else {

int i = 0;

while (i <= index) {

if(node != null) {

currentNode = node;

//注意这里有递增

node = node.next;

}

i++;

}

}

return currentNode;

}

/**

* 错误消息显示

@param index

     @return

     */

private String errMessage(int index) {

return "Size: "+ size() + ", index: "+ index;

}

}

测试方法TestSingleLinkedList.java

package hk.inso.test;

import hk.inso.service.SingleLinkedList;

/**

* Created by IntelliJ IDEA.

* Date: 8/11/15 4:58 PM

* Author: Richard

*/

public class TestSingleLinkedList {

public static void main(String[] args) {

SingleLinkedList<User> list = new SingleLinkedList<User>();

list.add(new User(5, "Jimmy""Girl"));

list.add(new User(7, "Tom""Boy"));

list.addLast(new User(6, "Amy""Girl"));

System.out.println(list.toString());

}

}

class User {

private int age;

private String name;

private String gender;

public User(int age, String name, String gender) {

this.age = age;

this.name = name;

this.gender = gender;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

@Override

public String toString() {

return "User{" +

"age=" age +

", name=‘" name \‘‘ +

", gender=‘" gender \‘‘ +

‘}‘;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-17 21:56:33

SingleLinkedList独立实现,无任何依赖包的相关文章

Mapreduce部署与第三方依赖包管理

Mapreduce部署是总会涉及到第三方包依赖问题,这些第三方包配置的方式不同,会对mapreduce的部署便捷性有一些影响,有时候还会导致脚本出错.本文介绍几种常用的配置方式: 1. HADOOP_CLASSPATH 在hadoop的相关配置文件中,添加CLASSPATH路径,那么在hadoop的各个进程启动时都会载入这些包,因此对于mapreduce-job jar中则不需要额外的引入这些jars,所以mapreduce-job jar会比较小[瘦jar],便于传输:但它的问题也比较明显,如

轻便WebAPI工具包,随身携带无操作系统依赖

WebAPI是一种高效的开发方式,一般涉及到HTML内面, Javascript库,后台数据库三部分. Hijk 是一个对WebAPI相关开发组件进行打包的轻量级开发工具包, 包括了数据库组件,常用JavaScript库,兼容javascript 3D特效库的扩展代码, 没有特定的平台依赖,非常符合近期减少对特定产品依赖的趋势. Hijk 是 HTML, iBoxDB, jQuery 三个库打包的简写. 使用简介: 像写普通C#类一样,无须特定接口. public class HelloWorl

使用CocoaPods管理iOS程序的依赖包

CocoaPods介绍 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其他类库又用到其他类库,“子子孙孙无穷尽也”,这也许是比较特殊的情况.总之意思就是,手动一个个去下载所需类库十分麻烦.另外一种常见情况是,你项目中用到的类库有更新,你必须得重新下载新版本,重新加入到项目中,十分麻烦.如果能有什么工具能解决这些恼人的问题,那将“善莫大焉”.所以,你需要 CocoaPods

Core 2.0 的dll实时更新、https、依赖包变更问题及解决

今天所有开发环境已经迁移到mac OS下的Visual Studio Code + 命令行编译发布,而运行服务器是CentOS7,和windows没什么关联了. 只要你Relese编译并在本地有一个与服务器相同的运行环境中运行成功了,迁移到真实服务器不会有什么难度. 下面是迁移到 2.0 版本之后遇到的3个问题及解决办法 1:有时候dll不会实时更新(不是每次都会遇到,并且这事情仅发生在Centos上)有时候你需要把与dll相关的所有边缘文件一同传上去(例如配套的xxx.config.json.

maven打包时加入依赖包及加入本地依赖包

maven打包的时候默认是不加入依赖的jar包的,所以想打出一个独立的可运行jar包的话直接mvn clean install package是不行的.需要略改动下pom文件,加入如下plugin <build> <sourceDirectory>src/main/java</sourceDirectory> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupI

Nginx服务安装从小白到精通你只差这个文件(包括各种依赖包的解释)

Nginx 安装nginx,升级 用户认证 auth_basic_user_file 虚拟主机 加密 反向代理: 源码包安装nginx yum –y install gcc pcre-devel(支持正则表达) openssl-devel(支持认证加密) #常见依赖包 useradd –s /sbin/nologin nginx #为程序创建用户 tar -xf nginx-1.8.0.tar.gz cd nginx-1.8.0 ./configure --help | grep with #查

flutter如何使用配置文件pubspec.yaml(位于项目根目录)来管理第三方依赖包

官方文档 在软件开发中,很多时候有一些公共的库或SDK可能会被很多项目用到,因此,将这些代码单独抽到一个独立模块,然后哪个项目需要使用时再直接集成这个模块,便可大大提高开发效率.很多编程语言或开发工具都支持这种“模块共享”机制,如Java语言中这种独立模块会被打成一个jar包,Android中的aar包,Web开发中的npm包等.为了方便表述,我们将这种可共享的独立模块统一称为“包”( Package). 一个APP在实际开发中往往会依赖很多包,而这些包通常都有交叉依赖关系.版本依赖等,如果由开

Maven找不到依赖包

Maven 是一个挺好的项目管理工具,但有时候,会因为配置出现一些奇奇怪怪的 bug,如:导入依赖包正常,也可以查看依赖包的详情,但运行项目或跑测试用例时,却出现找不到依赖包的错误(找不到包.找不到符号等异常),在项目的 pom.xml,添加以下配置. <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId>

Maven项目下HttpServletRequest 或 HttpServletResponse需引用的依赖包

转载: http://xyly624.blog.51cto.com/842520/865630/ Maven项目下HttpServletRequest 或 HttpServletResponse需引用的依赖包:servlet-api.jar,并将scope设置为provided. pom.xml: <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifac