数据结构之双向链表(JAVA实现)

欢迎转载,请附出处:

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));  

}
}  

Java实现的链表和c/c++有点不一样的地方是c/c++用的是指针,而Java用的是引用,这里的区别希望大家注意一下。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 10:44:40

数据结构之双向链表(JAVA实现)的相关文章

I学霸官方免费教程三十六:Java数据结构之双向链表结构

数据结构之双向链表 例如:现有双向链表TwoWayLinked中存储着1,2,3,4四个元素,那么集合对象中会有4个节点A.B.C.D,由上述结构可以知道,节点A中存储着元素1和节点B:节点B中存储着元素2和节点A和节点C,节点C中存储着元素3和节点B和节点D,节点D中存储着元素4和节点C.如果现在要在元素2和3中间插入一个元素5: 过程如下: 1.创建节点E,E中存储元素5 2.将E中的上一个节点赋值为节点B 3.将B中的下一个节点修改为节点E 4.将E中的下一个节点赋值为节点C 5.将C中的

数据结构与问题求解-Java语言描述(第三版)

数据结构对程序的重要性不言而喻,用java语言来实现常见的一些数据结构,以及在相应数据结构上的操作对学习java的同学来说是必须掌握的. 本系列博文参考<数据结构与问题求解-Java语言描述(第三版)>来实现 在自己学习的过程中,更希望有机会与大家交流. PS :本人是菜鸟,只是用博客的方式激励自己.请轻喷.Fighting!

数据结构之双向链表(包含双向循环链表)

双向(循环)链表是线性表的链式存储结构的又一种形式. 在之前已经讲述了单向链表和循环链表.相比于单向链表只能从头结点出发遍历整个链表的局限性,循环链表使得可以从任意一个结点遍历整个链表. 但是,不管单向链表也好,循环链表也罢,都只能从一个方向遍历链表,即只能查找结点的下一个结点(后继结点),而不能查找结点的上一个结点(前驱结点).鉴于上述问题,引入了双向链表.由于双向循环链表包含双向链表的所有功能操作.因此,我们只讲述双向循环链表. 与单向链表不同,双向链表的结点构造如下图所示.即一个结点由三个

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

JAVA数据结构--LinkedList双向链表

链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 相比于线性表顺序结构,操作复杂.由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn

Java数据结构之双向链表

管理单向链表的缺点分析: 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找. 单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点. 示意图 对上图的说明: 分析双向链表的遍历.添加.修改.删除的操作思路: 1)遍历:方法和单链表一样,只是可以向前查找,也可以向后查找 2)添加:(默认添加到双向链表的最后) 先找到双向链表的最后的节点 temp.next = newHeroNode;

数据结构和算法(Java版)

主要内容:(内容来自互联网以及李刚著作的<突破程序员基本功的16课>) 1.数据结构:线性表.栈.队列.树&二叉树 2.算法:常用内部排序(选择.插入.交换.归并) 目录: 1. 线性表(顺序存储.链式存储单链表.双向链表)-------------2014/10/15 2. 栈(顺序栈.链栈)                                        -------------2014/10/15 线性表(顺序存储.链式存储):一对一松耦合关系.(List就是线性

【数据结构】2.java源码关于LinkedList

关于LinkedList的源码关注点 1.从底层数据结构,扩容策略2.LinkedList的增删改查3.特殊处理重点关注4.遍历的速度,随机访问和iterator访问效率对比 1.从底层数据结构,扩容策略 构造函数不做任何操作,只要再add的时候进行数据初始化操作,以操作推动逻辑,而且linkedlist是一个双向链表,所以可以向前向后双向遍历由于构造函数并没有任何操作,其实这里我们可以先看新增操作,并且因为用的是链表所以无法随机访问,这里随机读取就会比较慢 ? 底层结构就是size,首节点,尾

线性链表的双向链表——java实现

.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为null. 循环链表:一种首尾相连的链表. 双向链表:每个节点有两个引用,一个指向当前节点的上一个节点,另外一个指向当前节点的下一个节点. 下面给出线性表双向链表的实现:java中LinkedList是线性表的链式实现,是一个双向链表. import java.util.NoSuchElementE