数据结构 -- 双向链表 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)+"  ");}}}