public class ListExer2 {
public static void main(String[] args) {
LinkList list = new LinkList();
list.add("a");
list.add("b");
list.add("c");
// list.add(0,"d");
// list.add(1, "e");
// list.remove(0);
// list.remove(2);
list.remove(1);
System.out.println(list);
}
} class LinkList {
private int size = 0; // 节点个数
private Node first; // 第一个节点
private Node last; // 最后一个节点 public LinkList() {
} public void add(String str) {
// 创建节点存储数据
Node node = new Node(null, str, null); // 列表此时为空
if (size == 0) {
// 如果列表为空,则头结点指向新节点
this.first = node;
} else {
// 原来的尾节点的下一位置为新节点
this.last.next = node;
// 新节点的上一位是原来的尾节点
node.prev = this.last;
}
// 新的节点变成了尾节点
this.last = node;
size++;
} public void add(int index, String str) {
// 判断下标是否越界
if (index > size)
throw new IndexOutOfBoundsException("Index:" + index + ", Size:"
+ size);
// 在尾部追加
if (index == size) {
this.add(str);
return;
}
Node node = new Node(null, str, null);
// 插入的头部
if (index == 0) {
node.next = this.first;
this.first.prev = node;
this.first = node;
} else { Node no = this.getNode(index); // 原节点的上一个节点的下一位变成新的节点
no.prev.next = node;
// 新的节点的上一位是原节点的上一位
node.prev = no.prev;
// 新节点的下一位是原来的节点
node.next = no;
// 原节点的上一位是新的节点
no.prev = node; }
size++;
} private Node getNode(int index) {
// 获取指定位置的节点
Node no = this.first;
for (int i = 0; i < index; i++) {
no = no.next;
}
return no;
} private void out(int index) {
// 判断下标越界
if (index >= size)
throw new IndexOutOfBoundsException("Index:" + index + ", Size:"
+ size); } public void remove(int index) { this.out(index);
// 头部
if (index == 0) {
this.first = this.first.next;
this.first.prev = null;
} /* 尾部 */else if (index == size - 1) {
this.last = this.last.prev;
this.last.next = null;
} else {
Node node = this.getNode(index); // 原节点的上一个节点的下一位变成原节点的下一位
node.prev.next = node.next;
// 原节点的下一个节点的上一位变成原节点的上一位
node.next.prev = node.prev;
}
size--;
} public int indexOf(String str) { Node node = this.first;
for (int i = 0; i < size; i++) {
String data = node.data;
if (data == str || data != null && data.equals(str))
return i;
node = node.next;
} return -1; } public String toString() { StringBuilder sb = new StringBuilder("[");
Node node = this.first;
for (int i = 0; i < size; i++) {
sb.append(node.data).append(", ");
node = node.next;
} String str = sb.toString();
if (size > 0)
str = str.substring(0, str.length() - 2);
return str += "]";
} // 利用节点存储数据
private class Node {
Node prev; // 上一个节点
String data; // 元素
Node next; // 下一个节点
public Node(Node prev, String data, Node next) {
super();
this.prev = prev;
this.data = data;
this.next = next;
} } }

LinkedList---链表各种方法的实现的更多相关文章

  1. JVM源码分析之深入分析Object类finalize()方法的实现原理

      原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 ​“365篇原创计划”第十篇. 今天呢!灯塔君跟大家讲: 深入分析Object类finalize()方法的实现原理 finalize 如果 ...

  2. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

  3. 2016 - 2 - 19 ARC内存管理知识总结(一,arc基本概念及alloc等方法的实现)

    一. ARC的基本概念 1. 在objc中采用automatic reference counting 机制, 让编译器来进行内存管理.在降低程序崩溃,内存管理泄漏等风险的同时,很大程度减少了程序员的 ...

  4. 05_动手动脑之String.equals()方法的实现代码

    Question: 请查看String.equals()方法的实现代码,注意学习其实现方法. Answer: java中的String.equals()方法的实现代码: equals()法是根类Obj ...

  5. Atitit paip.对象方法的实现原理与本质.txt

    Atitit paip.对象方法的实现原理与本质.txt 对象方法是如何实现的1 数组,对象,字典1 对象方法是如何实现的 这显然是一个对象方法调用.但对象方法是如何实现的呢?在静态语言中,因为有编译 ...

  6. matchesSelector及低版本IE中对该方法的实现

    matchesSelector用来匹配dom元素是否匹配某css selector.它为一些高级方法的实现提供了基础支持,比如事件代理,parent, closest等. W3C在2006年就提出了该 ...

  7. 动手动脑之查看String.equals()方法的实现代码及解释

    动手动脑 请查看String.equals()方法的实现代码,注意学习其实现方法. 第一个是false,后三个是true. package stringtest; public class Strin ...

  8. OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理

    代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...

  9. java集合的contains(obj)方法的实现

    在实际项目中我们通常会有一个需求就是:想知道在一个列表中是否包含某一个对象 这里ArrayList表.HashSet表和HashMap表都提供了一个contains(obj)方法, 下面说一下两个列表 ...

  10. [转]原生JS-查找相邻的元素-siblings方法的实现

    在针对element的操作里,查找附近的元素是一个不可少的过程,比如在实现tab时,其中的一个div增加了“on”class,其他的去除“on”class.如果用jquery的朋友就肯定不会陌生sib ...

随机推荐

  1. FZU 1921——栀子花开——————【线段树单点更新】

    栀子花开 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  2. 【ubuntu】给新装好的UBUNTU系统配置静态IP

    最近在自己装有win7系统的thinkpad电脑上,给安装了Ubuntu16.04双系统. 想在ubuntu下配置一个hadoop伪分布式,最首要的就是要给系统配置一个静态IP . 一开始我按照网上的 ...

  3. spring-boot 1.4.x遇到的cpu高的问题

    如果你的spring-boot应用里tomcat线程耗cpu较高,并主要耗在做读取jar的操作上(堆栈类似下面),可能跟我们遇到同样的问题. CRC32.update(byte[], int, int ...

  4. 20个最受欢迎的Linux命令(转)

    本文根据 commandlinefu 网站的历史排名,筛选出了前 20 个得票最高的 Linux 命令.看看你都能熟练使用了吗? 1.以 root 帐户执行上一条命令 sudo !! 2.利用 Pyt ...

  5. JavaScript对象 原型

    javascript对象就是一组数据和功能的集合,除原始类型(string.number.boolean.null.undefined)之外,其余都是对象. 可以通过对象直接量(字面量).new.和O ...

  6. Mysql只Union用法

    MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 举例说明: select * from table1 u ...

  7. 通过response向服务器用Io流写入图片

       1.响应头设置字节.     使用response获得字节输出流        ServletOutputStream out = response.getOutputStream();     ...

  8. servlet中this.getServletContext(); this.getServletConfig().getServletContext(); 的区别

    WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用.ServletConfig对象中维护了ServletContext对象的引用,开发人 ...

  9. scss-变量作用域

    SCSS之所以便利,是因为它具有了编程语言的某些特性. 让原本规则刻板的CSS变的灵活起来,下面介绍一下SCSS中的作用域概念. 几乎所有编程语言都有作用域概念的涉及,原理大同小异,SCSS中的也是如 ...

  10. Don't forget, a person's greatest emotional need is to feel appreciated.

    Don't forget, a person's greatest emotional need is to feel appreciated.莫忘记,人类情感上最大的需要是感恩.