根据链表的原理,自己实现一个简易版的LinkedList
2017-11-04 04:19
711 查看
前言
接上一篇,本次根据链表的实现原理,自己来尝试写一个LinkedList。MyLinkedList主要包括增、删、改、查几个功能。
代码如下
/** * 自己实现一个简易版的LinkedList * * @author ALion * @version 2017/11/4 2:22 */ public class MyLinkedList<E> { private Node<E> first; private Node<E> last; private int size; public int size() { return size; } /** * 在末端添加一个element */ public void add(E element) { Node<E> newNode = new Node<>(); if (first == null) { newNode.pre = null; newNode.element = element; newNode.next = null; first = newNode; last = newNode; } else { newNode.pre = last; newNode.element = element; newNode.next = null; last.next = newNode; last = newNode; } size++; } /** * 获取index位置的Node */ private Node<E> node(int index) { checkIndex(index); if (index < (size >> 1)) { Node<E> temp = first; for (int i = 0; i < index; i++) temp = temp.next; return temp; } else { Node<E> temp = last; for (int i = size - 1; i > index; i--) temp = temp.pre; return temp; } } /** * 获取index位置的element */ public E get(int index) { Node<E> node = node(index); return node == null ? null : node.element; } /** * 移除index位置的element */ public void remove(int index) { Node<E> temp = node(index); if (first != null && temp != null) { if (index == 0) { temp.next.pre = null; first = temp.next; } else if (index == size - 1) { temp.pre.next = null; last = temp.pre; } else { Node left = temp.pre; Node right = temp.next; left.next = right; right.pre = left; } size--; } } /** * 在index处插入一个element */ public void add(int index, E element) { Node node = node(index); Node newNode = new Node(); newNode.element = element; if (node != null) { Node left = node.pre; Node right = node; left.next = newNode; newNode.pre = left; newNode.next = right; right.pre = newNode; size++; } } /** * 改变index位置的element为新的element */ public void set(int index, E element) { Node node = node(index); Node newNode = new Node(); newNode.element = element; if (node != null) { Node left = node.pre; Node right = node.next; left.next = newNode; newNode.pre = left; newNode.next = right; right.pre = newNode; } } /** * 检查index范围 */ private void checkIndex(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("index不能<0或者>=size"); } } /** * 链表节点类 */ private static class Node<E> { Node<E> pre; E element; Node<E> next; } }
测试一下
/** * Main * * @author ALion * @version 2017/11/4 2:34 */ public class Main { public static void main(String[] args) { MyLinkedList<String> list = new MyLinkedList<>(); list.add("你好1"); System.out.println(list.get(0)); list.add("你好2"); list.add("你好3"); list.add("你好4"); list.remove(0); list.add(2, "nihao"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }
相关文章推荐
- 根据数组+链表的原理,自己实现一个简易版的HashMap
- 根据数组的原理,自己实现一个简易版的ArrayList
- 自己实现一个泛型LinkedList
- 自己动手系列——实现一个简单的LinkedList
- 容器第四课,JDK源代码分析,自己实现LinkedList,双向链表的概念_节点定义
- 自己实现单向链表讨论一下LinkedList的效率
- 【java集合】自己实现简易的LinkedList
- 自己实现了一个LinkedList对照源码一看,呵呵呵
- 自己实现LinkedList集合add,get,remove
- 自己实现的一个简易Spring框架(IoC+AOP)
- Delete Node in a Linked List 删除链表的一个节点
- 实现一个简易的IoC框架(上)(此篇与Spring.NET无关,为自己手写IoC框架)
- 单链表的实现---SingleLinkedList
- C实现 LeetCode->Linked List Cycle 双指针大法)(单链表是否有环 并计算环长度)
- 【讨论思考】可不可以不用pointer而实现一个linked list?
- 黑马程序员----List集合中的另外两个小弟,Vector LinkedList(实现结构,本身特点,自己的独有方法). 泛型技术:
- 【LeetCode-面试算法经典-Java实现】【142-Linked List Cycle II(单链表中有环II)】
- 设计一个整型链表类list,能够实现链表节点的插入、删除、以及链表数据的输出操作。
- 49. 3种方法实现复杂链表的复制[clone of complex linked list]
- 自己用c语言结构体实现一个链表结构体(增删查改)