一.先上代码:

1.方式一:

public class LinkedList<E> {

    //节点,用来存放数据:数据+下一个元素的引用
private class Node{
private E e;
private Node next;
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
public String toString(){
return e.toString();
}
} private Node head;
private int size; /**
* 构造方法
*/
public LinkedList(){
head = null;
size = 0;
} /**
* 获取链表中元素的个数
* @return
*/
public int getSize(){
return size;
} /**
* 判断链表是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
} /**
* 链表头添加新元素
*/
public void addFirst(E e){
Node node = new Node();
node.next = head;
head = node;
size ++;
} /**
* 链表中间添加元素
* @param index
* @param e
*/
public void add(int index,E e){
if (index < 0 || index > size){
throw new IllegalArgumentException("Add Failed");
}
if (index == 0){
addFirst(e);
}else {
Node prev = head;
for (int i = 0 ; i < index-1; i++){
prev = prev.next;
}
Node node = new Node(e);
node.next = new Node(e);
prev.next = node;
}
size++;
} /**
* 链表末尾添加元素
* @param e
*/
public void addList(E e){
add(size,e);
} }

2.方式二:

public class LinkedListPlus<E> {

    //节点,用来存放数据:数据+下一个元素的引用
private class Node{
private E e;
private Node next;
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
public String toString(){
return e.toString();
}
} private Node dummyHead;//虚拟头节点
private int size;
public LinkedListPlus(){
dummyHead = new Node(null,null);
size = 0;
}
  public int getSize(){
  return size;
  }   public boolean isEmpty(){
   return size == 0;
  } public void add(int index,E e){
if (index < 0 || index > size){
throw new IllegalArgumentException("Add Failed");
}
Node prev = dummyHead;
for (int i = 0; i < index; i++) {
prev = prev.next;
}
Node node = new Node(e);
node.next = prev.next;
prev.next = node;
size++;
} public void addFirst(E e){
add(0,e);
} public void addLast(E e){
add(size,e);
} public E get(int index){
if (index < 0 || index > size){
throw new IllegalArgumentException("Add Failed");
}
Node cur = dummyHead.next;
for (int i = 0; i <size ; i++) {
cur = cur.next;
}
return cur.e;
} public E getFirst(){
return get(0);
} public E getLast(){
return get(size-1);
} public void set(int index,E e){
if (index < 0 || index > size){
throw new IllegalArgumentException("Add Failed");
}
Node cur = dummyHead.next;
for (int i = 0; i <size ; i++) {
cur = cur.next;
}
cur.e = e;
} public boolean contains(E e){
Node cur = dummyHead.next;
while (cur != null){
if (cur.e.equals(e)){
return true;
}
cur = cur.next;
}
return false; } public E remove(int index){
if (index < 0 || index > size){
throw new IllegalArgumentException("Add Failed");
}
Node prev = dummyHead;
for (int i = 0; i <index ; i++) {
prev = prev.next;
}
Node retNode = prev.next;
prev.next = retNode.next;
retNode.next = null;
size--;
return retNode.e;
} public E removeFirst(){
return remove(0);
} public E removeLast(){
return remove(size-1);
} @Override
public String toString() {
StringBuilder res = new StringBuilder();
Node cur = dummyHead.next;
while (cur != null){
res.append(cur+"->");
cur = cur.next;
}
res.append("null");
retu

自己实现数据结构系列二---LinkedList的更多相关文章

  1. D&F学数据结构系列——二叉堆

    二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...

  2. 【JavaScript数据结构系列】05-链表LinkedList

    [JavaScript数据结构系列]05-链表LinkedList 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识链表结构(单向链表) 链表也是线性结构, 节点相连构成链表 ...

  3. 数据结构之链表(LinkedList)(二)

    数据结构之链表(LinkedList)(一) 双链表 上一篇讲述了单链表是通过next 指向下一个节点,那么双链表就是指不止可以顺序指向下一个节点,还可以通过prior域逆序指向上一个节点 示意图: ...

  4. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

  5. 【JavaScript数据结构系列】00-开篇

    [JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...

  6. Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  7. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  8. SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

    原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...

  9. ETL利器Kettle实战应用解析系列二

    本系列文章主要索引如下: 一.ETL利器Kettle实战应用解析系列一[Kettle使用介绍] 二.ETL利器Kettle实战应用解析系列二 [应用场景和实战DEMO下载] 三.ETL利器Kettle ...

随机推荐

  1. Django Form ModelForm modelfromset

    forms 组件 Form 组件 form表单完成的事情 提供input可以提交数据 对提交的数据进行校验 提供错误提示 定义form组件 from django import forms class ...

  2. Redis本身是单线程线程安全的内存数据库,但是不代表你的使用就是线程安全的

    网上一个错误示例:https://www.cnblogs.com/Simeonwu/p/7881100.html,部分代码如下: package com.me.config; import redis ...

  3. 433 模块 ARDUINO测试

    实验硬件 发射端 Arduino + 433超外差发射机     高,低电平和悬空三种模式切换  由简单的官方库修改 /* This is a minimal sketch without using ...

  4. 转载 多线程实际运用<第七篇>

    多线程实际运用<第七篇> 1.单线程采集100个页面 class Program { static int i = 6991275; static void Main(string[] a ...

  5. MetaMask/metamask-inpage-provider

    https://github.com/MetaMask/metamask-inpage-provider Used to initialize the inpage ethereum provider ...

  6. 梯度下降(Gradient Descent)

    在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...

  7. springzuul实现限流

    限流描述  https://www.cnblogs.com/LBSer/p/4083131.html 第一步添加pom文件 <!--限流--> <dependency> < ...

  8. Linux 读取 (*.xls)文件读取,使用libxls库

    首先下载libxls,项目地址:http://sourceforge.net/projects/libxls/,备用下载:libxls-1.4.0.zip 解压后使用: ./configure --p ...

  9. redis make jemalloc

    zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directoryzmalloc.h:55:2: error: #error ...

  10. day87

    分页器 PageNumberPagination(普通分页器) 说明: 配置分页器的中最大显示个数(也可在setting中做全局配置) page.page_size = 2 REST_FRAMEWOR ...