• JAVA实现双向链表


                                            JAVA实现双向链表

    其实java.util.LinkedList就是一个双链表:

    public class DoubleLinkedList
    {
      // 节点类Node

      private static class Node
      {
        Object value;
        Node prev = this;
        Node next = this;

        Node(Object v)
        {
          value = v;
        }

        public String toString()
        {
          return value.toString();
        }
      }
      private Node head = new Node(null); // 头节点
      private int size; // 链表大小
      // 以下是接口方法

      public boolean addFirst(Object o)
      {
        addAfter(new Node(o), head);
        return true;
      }

      public boolean addLast(Object o)
      {
        addBefore(new Node(o), head);
        return true;
      }

      public boolean add(Object o)
      {
        return addLast(o);
      }

      public boolean add(int index, Object o)
      {
        addBefore(new Node(o), getNode(index));
        return true;
      }

      public boolean remove(int index)
      {
        removeNode(getNode(index));
        return true;
      }

      public boolean removeFirst()
      {
        removeNode(head.next);
        return true;
      }

      public boolean removeLast()
      {
        removeNode(head.prev);
        return true;
      }

      public Object get(int index)
      {
        return getNode(index).value;
      }

      public int size()
      {
        return size;
      }

      public String toString()
      {
        StringBuffer s = new StringBuffer("[");
        Node node = head;
        for (int i = 0; i < size; i++)
        {
          node = node.next;
          if (i > 0)
            s.append(", ");
          s.append(node.value);
        }
        s.append("]");
        return s.toString();
      }
      //以下是实现方法

      private Node getNode(int index)
      {
        if (index < 0 || index >= size)
          throw new IndexOutOfBoundsException();
        Node node = head.next;
        for (int i = 0; i < index; i++)
          node = node.next;
        return node;
      }

      private void addBefore(Node newNode, Node node)
      {
        newNode.next = node;
        newNode.prev = node.prev;
        newNode.next.prev = newNode;
        newNode.prev.next = newNode;
        size++;
      }

      private void addAfter(Node newNode, Node node)
      {
        newNode.prev = node;
        newNode.next = node.next;
        newNode.next.prev = newNode;
        newNode.prev.next = newNode;
        size++;
      }

      private void removeNode(Node node)
      {
        node.prev.next = node.next;
        node.next.prev = node.prev;
        node.prev = null;
        node.next = null;
        size--;
      }
    }
    //有些地方还可以优化,比如查找时可以判断索引是否大于size的一半,如果是的话,就从另一头开始迭代。

    //可以用这个类测试一下:

    public class Test
    {
      public static void main(String[] args)
      {
        DoubleLinkedList dll = new DoubleLinkedList();
        //添加
        dll.add("张曼玉");
        dll.add("钟楚红");
        dll.add("刘嘉玲");
        System.out.println(dll);

        //添加到最前
        dll.addFirst("林青霞");
        System.out.println(dll);

        //添加到最后,同添加
        dll.addLast("梅艳芳");
        System.out.println(dll);

        //添加到指定位置
        dll.add(4, "王祖贤");
        System.out.println(dll);

        //移除最前的
        dll.removeFirst();
        System.out.println(dll);

        //移除最后的
        dll.removeLast();
        System.out.println(dll);

        //移除指定位置上的
        dll.remove(2);
        System.out.println(dll);

        //返回指定位置上的元素
        System.out.println(dll.get(1));

      }
    }
    输出:
    [张曼玉, 钟楚红, 刘嘉玲]
    [林青霞, 张曼玉, 钟楚红, 刘嘉玲]
    [林青霞, 张曼玉, 钟楚红, 刘嘉玲, 梅艳芳]
    [林青霞, 张曼玉, 钟楚红, 刘嘉玲, 王祖贤, 梅艳芳]
    [张曼玉, 钟楚红, 刘嘉玲, 王祖贤, 梅艳芳]
    [张曼玉, 钟楚红, 刘嘉玲, 王祖贤]
    [张曼玉, 钟楚红, 王祖贤]
    钟楚红

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

  • 相关阅读:
    Java 正则表达式
    连续子数组最大和
    背包问题
    二叉树的数组存储
    各种鸟
    mac关闭和开启启动声
    关于栈和队列随想
    linux主机名 hostname
    mysql创建新用户并且授权远程访问
    关于linux的用户
  • 原文地址:https://www.cnblogs.com/skiwdhwhssh/p/10295682.html
Copyright © 2020-2023  润新知