数据结构 -- 双向链表 linkedList 手写
来源:互联网 发布:男生冬季服装搭配知乎 编辑:程序博客网 时间:2024/05/20 03:43
双向链表 linkedList
package list;public class LinkedList<E> {transient int size = 0; transient Node<E> first; transient Node<E> last; public LinkedList() { } public void add(E e){ linkedLast(e); size++; }private void linkedLast(E e) {// TODO Auto-generated method stubNode<E> newNode = new Node<E>(last, e, null);System.out.println("e=="+e);//先保存起来lastNode<E> l = last;//将最后一个last指向新元素last = newNode;//当last为空时 first指向元素 否则 将最后一个元素的next 指向新节点if (l ==null) {first = newNode;}else{l.next = newNode;}}/** * 在任意位置添加元素 * @param index * @param e */public void add(int index,E e){if (index<0 || index >size || e == null) {return;}//当是在尾部添加元素时if (index == size) {linkedLast(e);}else{Node<E> p = node(index);//当时在头部添加元素时if (index == 0) {Node<E> newNode = new Node<E>(null, e, p);p.prev = newNode;first = newNode;}else{//找到index节点的p的prev节点Node<E> pp = p.prev;//创建要添加的e的节点对象并将它的前节点和后节点设置Node<E> newNode = new Node<E>(pp, e, p);//将前一个节点的下一个节点指向新节点pp.next = newNode;//将原来p节点的上一个节点设置给新节点p.prev = newNode;}}size++;}public void remove(int index) {Node<E> target = node(index);unlinked(target);size --;}private void unlinked(Node<E> p){//当是顶点节点时if (p.prev == null) {first = p.next;}else{p.prev.next = p.next;}//当时尾部节点时if (p.next == null) {last = p.prev;}else{p.next.prev = p.prev;}}private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }public E get(int index) {if (index<0 || index >size) {return null;}return node(index).item;}private Node<E> node(int index) {// TODO Auto-generated method stub//优化算法if (index < (size>>1)) {Node<E> node = first;for (int i = 0; i < index; i++) {node = node.next;}return node;}else{Node<E> node1 = last;for (int i = size -1; i > index; i--) {node1 = node1.prev;}return node1;}}}测试代码package list;public class TestMain {public static void main(String[] args) {// TODO Auto-generated method stubLinkedList<String> linkedList = new LinkedList<>();linkedList.add("aaaa");linkedList.add("bbbb");linkedList.add("cccc");linkedList.add(0,"dddd");linkedList.add(1,"eeee");for (int i = 0; i < linkedList.size; i++) {System.out.print(linkedList.get(i)+"--"+linkedList.get(i+1)+" ");}System.out.println();linkedList.remove(0);for (int i = 0; i < linkedList.size; i++) {System.out.print(linkedList.get(i)+"--"+linkedList.get(i+1)+" ");}}}
阅读全文
0 0
- 数据结构 -- 双向链表 linkedList 手写
- [数据结构]双向链表实现LinkedList
- 双向链表(LinkedList)
- LinkedList 双向链表
- Redis内部数据结构详解之双向链表(linkedlist)
- [java数据结构]--java双向链表LinkedList的简单实现
- Java数据结构之手写LinkedList
- linkedlist双向链表结构
- 《数据结构和Java集合框架第三版》读书笔记(六)LinkedList双向链表
- 简单实现 linkedList 双向链表
- 利用双向链表实现LinkedList
- 双向链表(LinkedList) java实现
- LinkedList,双向链表的实现
- Java LinkedList双向链表源码分析
- LinkedList之双向链表结构
- 简单实现LinkedList(双向链表)
- LinkedList底层原理(双向链表)
- 简谈JAVA基础--双向链表(LinkedList)
- Redis的监控功能
- Ubuntu16.04LTS 下ros(kinetic)的arduino应用(三)
- Dubbo动态改变端口配置
- 编程思想之多线程与多进程(3)——Java中的多线程
- 机器学习和深度学习面试题
- 数据结构 -- 双向链表 linkedList 手写
- c语言第三次练习题
- CSS3-转换之perspective
- VS2010下使用QT环境配置
- 好文
- 编程思想之多线程与多进程(2)——线程优先级与线程安全
- untiy去掉所有烦人的warning
- 妙用CommonException
- vue.js 定时器