zoukankan      html  css  js  c++  java
  • JAVA双向链表

    1.链表是一种重要的数据结构,在程序设计中占有很重要的地位

    2.我们可以用类List来实现链表结构,用变量Head、Tail、Length、Pointer来实现表头。存储当前结点的指针时有一定的技 巧,Pointer并非存储指向当前结点的指针,而是存储指向它的前趋结点的指针,当其值为null时表示当前结点是第一个结点。那么为什么要这样做呢? 这是因为当删除当前结点后仍需保证剩下的结点构成链表,如果Pointer指向当前结点,则会给操作带来很大困难。那么如何得到当前结点呢,我们定义了一 个方法cursor(),返回值是指向当前结点的指针。类List还定义了一些方法来实现对链表的基本操作,通过运用这些基本操作我们可以对链表进行各种 操作。例如reset()方法使第一个结点成为当前结点。insert(Object d)方法在当前结点前插入一个结点,并使其成为当前结点。remove()方法删除当前结点同时返回其内容,并使其后继结点成为当前结点,如果删除的是最 后一个结点,则第一个结点变为当前结点。

      1 /**
      2  * 双向链表的实现
      3  * @author Skip
      4  * @version 1.0
      5  */
      6 public class DoubleNodeList<T> {
      7  //节点类
      8  private static class Node<T>{
      9   Node<T> perv;  //前节点
     10   Node<T> next;  //后节点
     11   T data;    //数据
     12 
     13   public Node(T t){
     14    this.data = t;
     15   }
     16  }
     17  private Node<T> head;  //头节点
     18  private Node<T> last;  //尾节点
     19  private Node<T> other;  //备用节点存放临时操作
     20  private int length;  //链表长度
     21 
     22  /**
     23   * 无参构造
     24   */
     25  public DoubleNodeList(){
     26   head = new Node<T>(null);
     27   last = head;
     28   length = 0;
     29  }
     30 
     31  /**
     32   * 初始化时创建一个节点
     33   * @param data 数据
     34   */
     35  public DoubleNodeList(T data){
     36   head = new Node<T>(data);
     37   last = head;
     38   length = 1;
     39  }
     40 
     41  /**
     42   * 添加一个节点
     43   * @param data 添加的数据
     44   */
     45  public void add(T data){
     46   if(isEmpty()){
     47    head = new Node<T>(data);
     48    last = head;
     49    length++;
     50   }else{
     51    //尾插法
     52    other = new Node<T>(data);
     53    other.perv = last;
     54    last.next = other;
     55    last = other;
     56    length++;
     57   }
     58  }
     59 
     60  /**
     61   * 在指定数据后插入一个节点
     62   * @param data 指定的数据
     63   * @param insertData 插入的数据
     64   * @return 插入成功返回true,不成功返回false
     65   */
     66  public boolean addAfert(T data , T insertData){
     67   other = head;
     68   while(other != null){
     69    if(other.data.equals(data)){
     70     Node<T> t = new Node<T>(insertData);
     71     t.perv = other;
     72     t.next = other.next;
     73     other.next = t;
     74     //判断是否在最后一个节点后添加节点
     75     if(t.next==null){
     76      last = t;
     77     }
     78     length++;
     79     return true;
     80    }
     81    other = other.next;
     82   }
     83   return false;
     84  }
     85 
     86  /**
     87   * 在指定数据前插入一个节点
     88   * @param data 指定的数据
     89   * @param insertData 插入的数据
     90   * @return 插入成功返回true,不成功返回false
     91   */
     92  public boolean addBefore(T data, T insertData){
     93   other = head;
     94   while(other != null){
     95    if(other.data.equals(data)){
     96     Node<T> t = new Node<T>(insertData);
     97     t.perv = other.perv;
     98     t.next = other;
     99     other.perv.next = t;
    100     length++;
    101     return true;
    102    }
    103    other = other.next;
    104   }
    105   return false;
    106  }
    107 
    108  /**
    109   * 获得索引处的数据
    110   * @param index 索引
    111   * @return 数据
    112   */
    113  public T get(int index){
    114   if(index>length || index<0){
    115    throw new IndexOutOfBoundsException("索引越界:"+index);
    116   }
    117   other = head;
    118   for(int i=0;i<index;i++){
    119    other = other.next;
    120   }
    121   return other.data;
    122  }
    123 
    124  /**
    125   * 新值替换旧值
    126   * @return 成功为true,未找到为false
    127   */
    128  public boolean set(T oldValue,T newValue){
    129   other = head;
    130   while(other!=null){
    131    if(other.data.equals(oldValue)){
    132     other.data = newValue;
    133     return true;
    134    }
    135    other = other.next;
    136   }
    137   return false;
    138  }
    139 
    140  /**
    141   * 移除指定的元素
    142   * @param data 需要移除的元素
    143   * @return 不存在为false,成功为true
    144   */
    145  public boolean remove(T data){
    146   other = head;
    147   while(other != null){
    148    if(other.data.equals(data)){
    149     other.perv.next = other.next;
    150     length--;
    151     return true;
    152    }
    153    other = other.next;
    154   }
    155   return false;
    156  }
    157 
    158  /**
    159   * 链表中是否包含此元素
    160   * @return 包含为true,不包含为false
    161   */
    162  public boolean contains(T data){
    163   other = head;
    164   while(other != null){
    165    if(other.data.equals(data)){
    166     return true;
    167    }
    168    other = other.next;
    169   }
    170   return false;
    171  }
    172 
    173  /**
    174   * 获得最后一个节点的数据
    175   * @return 最后一个节点的数据
    176   */
    177  public T getLast(){
    178   return last.data;
    179  }
    180 
    181  /**
    182   * 获得第一个节点的数据
    183   * @return 第一个节点的数据
    184   */
    185  public T getFirst(){
    186   return head.data;
    187  }
    188 
    189  /**
    190   * 获得链表的长度
    191   * @return 长度
    192   */
    193  public int getSize(){
    194   return length;
    195  }
    196 
    197  /**
    198   * 是否为空链表
    199   * @return 空链表为true,非空链表为false
    200   */
    201  public boolean isEmpty(){
    202   return length==0;
    203  }
    204 
    205  /**
    206   * 清空链表
    207   */
    208  public void clear(){
    209   head = null;
    210   length = 0;
    211  }
    212 
    213  /**
    214   * 输出链表内所有节点
    215   */
    216  public void printList(){
    217   if(isEmpty()){
    218    System.out.println("空链表");
    219   }else{
    220    other = head;
    221    for(int i=0;i<length;i++){
    222     System.out.print(other.data+" ");
    223     other = other.next;
    224    }
    225    System.out.println();
    226   }
    227  }
    228 }
  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/yoyohong/p/5766740.html
Copyright © 2011-2022 走看看