双向链表

出处:
http://blog.csdn.net/as02446418/article/details/47114711 
最近重新复习了一些基础的数据结构,发觉自己好多已经淡忘了,索性重新捡起来以前的知识,今天笔者回顾了一下链表的知识,用JAVA实现了一个双向链表,下面来看代码:

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.prev = node.prev;
    newNode.next = node;
    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.next.prev = node.prev;
    node.prev.next = node.next;
    node.prev = null;
    node.next = null;
    size--;
  }  
}  
//有些地方还可以优化,比如查找时可以判断索引是否大于size的一半,如果是的话,就从另一头开始迭代。  

测试类:

public class Test  
{  
public static void main(String[] args)  
{  
  DoubleLinkedList dll = new DoubleLinkedList();  
  //添加  
  dll.add("A");  
  dll.add("B");  
  dll.add("C");  
  System.out.println(dll);  

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

  //添加到最后 
  dll.addLast("E");  
  System.out.println(dll);

  //添加到指定位置  
  dll.add(4, "F");  
  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));  

}  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值