統一接口,利用線性表和鏈表實現可變長數組

先介紹一下接口

 

package linearlist;

public interface LinearListInterface {
  public boolean isEmpty();

  public int size();

  public Object get(int index);

  public int indexOf(Object theElement);

  public Object remove(int index);

  public void add(int index, Object theElement);

  public String toString();
}

線性表實現

package ArrayList;

import linearlist.LinearListInterface;

public class ArrayLinearList
    implements LinearListInterface {
  //
保護類型數據成員
  private Object[] element; //
元素的對象數組
  private int size; //
數組中元素的個數

  // 構造函數
  /**
以初始化的initialCapacity值創建數組類型的線性表
   *
initialCapacity < 1 則拋參數異常
   * */
  public ArrayLinearList(int initialCapacity) {
    if (initialCapacity < 1) {
      throw new IllegalArgumentException
          ("initialCapacity must be >= 1");
    }
    element = new Object[initialCapacity];
  }

  /** 重載的構造函數,缺省的initialcapacity10 */
  public ArrayLinearList() {
    this(10);
  }

  public ArrayLinearList(LinearListInterface list) {
    this(list.size());
    for (int i = 0; i < list.size(); i++) {
      this.add(i, list.get(i));
    }
  }

  // 實現接口的方法
  /** @
僅當空表時返回真 */
  public boolean isEmpty() {
    return size == 0;
  }

  /** @返回當前線性表的元素個數 */
  public int size() {
    return size;
  }

  /** @內部方法,檢查下標的合法性(介於 0 size - 1之間)
   *
否則拋越界異常*/
  void checkIndex(int index) {
    if (index < 0 || index >= size) {
      throw new IndexOutOfBoundsException
          ("index = " + index + "  size = " + size);
    }
  }

  /** @返回指定位置index的元素
   * @
若位置序號不合理,直接拋異常 */
  public Object get(int index) {
    checkIndex(index);
    return element[index];
  }

  /** @返回該表中等於給定元素的第一個元素序號
   *
若無此元素則返回 -1 */
  public int indexOf(Object theElement) {
    //
element[]中查找元素theElement
    for (int i = 0; i < size; i++) {
      if (element[i].equals(theElement)) {
        return i;
      }
    }
    //
元素未找到
    return -1;
  }

  /** 刪除表中給定位置index的元素
   *
所有高於index值的元素下標減1,即左移
   * @
index不合理,拋越界異常
   * @
否則返回要刪除的元素*/
  public Object remove(int index) {
    checkIndex(index);

    // 把待刪元素緩存爲removedElement(以免元素左移覆蓋)
    Object removedElement = element[index];

    // 相關元素左移一位
    for (int i = index + 1; i < size; i++) {
      element[i - 1] = element[i];

      // size1 並置爲null以便於垃圾回收
    }
    element[--size] = null;

    // 返回所刪除的元素
    return removedElement;
  }

  // 內部方法,用新長度newLength進行表空間的擴容
  Object[] ChangeArrayLength(Object[] element, int newLength) {
    //
以希望的長度及同樣的類型分配數組空間
    Object[] newArray = new Object[newLength];

    // 老空間元素到新空間的拷貝a
    for (int i = 0; i < size; i++) {
      newArray[i] = element[i];

      // 返回新空間
    }
    return newArray;
  }

  /** 按給定的位序index插入一個元素.
   *
所有等於或高於index值的元素下標增1,即右移
   * @
index不合理,即index不在 0 size之間,則拋越界異常,*/
  public void add(int index, Object theElement) {
    if (index < 0 || index > size) {

      // 非法位置則拋出異常
      throw new IndexOutOfBoundsException
          ("index = " + index + "  size = " + size);
    }

    // 對於合法的 index, 確認空間
    if (size == element.length) {

      // 若空間不夠, 按雙倍大小擴容
      element = ChangeArrayLength(element, 2 * size);

    }
    //
相關元素右移一位
    //
如果size=0,就不執行
    for (int i = size - 1; i >= index; i--) {
      element[i + 1] = element[i];

    }
    element[index] = theElement;

    size++;
  }

  /** 到字符串的轉換 */
  public String toString() {
    StringBuffer s = new StringBuffer("[");

    // 添加元素到字符緩衝區
    for (int i = 0; i < size; i++) {
      if (element[i] == null) {
        s.append("null, ");
      }
      else {
        s.append(element[i].toString() + ", ");

      }
    }
    if (size > 0) {
      s.delete(s.length() - 2, s.length()); //
去掉最後一個 ","

    }
    s.append("]");

    // 返回創建的字符串 s
    return new String(s);
  }

} // ArrayLinearList

鏈表實現

  

//////         Package LinkList               ////////

//class LinkList

package LinkList;

import linearlist.LinearListInterface;

public class LinkList

    implements LinearListInterface {

  private int size;

  protected LinkNode head = new LinkNode();

  protected LinkNode current = head, tail = head;

  public LinkList() {

  }

  //複製鏈表

  public LinkList(LinearListInterface list) {

    for(int i=0;i<size;i++){

      this.add(i,list.get(i));

    }

  }

  //判斷是否爲空

  public boolean isEmpty() {

    return size == 0;

  }

  //返回表長

  public int size() {

    return size;

  }

  //獲得指定位置的對象

  public Object get(int index) {

    checkIndex(index);

    // 移動到希望的結點

    LinkNode p = head;

    for (int i = 0; i <= index; i++) {

      p = p.next;

    }

    return p.element;

  }

  //找對象的位置,找到返回位置,找不到返回-1

  public int indexOf(Object theElement) {

    // 在鏈表中查找元素值爲theElement的結點

    LinkNode p = head.next;

    int index = 0; // 當前結點的序號

    while (p != null &&

           !p.element.equals(theElement)) {

      //移動到下一個結點

      p = p.next;

      index++;

    }

    // 確認是否找到所匹配的元素

    if (p == null) {

      return -1;

    }

    else {

      return index;

    }

  }

  /** @位置參數不合理則拋越界異常

   */

  void checkIndex(int index) {

    if (index < 0 || index >= size) {

      throw new IndexOutOfBoundsException

          ("index = " + index + "  size = " + size);

    }

  }

  //刪除指定位置的節點

  public Object remove(int index) {

    checkIndex(index);

    Object removedElement;

    // p取得所希望結點的前驅結點

    LinkNode p = head;

    for (int i = 0; i < index; i++) {

      p = p.next;

    }

    removedElement = p.next.element;

    p.next = p.next.next; // 正式刪除符合給定要求的結點

    size--;

    return removedElement;

  }

  public void removeAll() {

    head.next = null;

    tail = current = head;

    size = 0;

  }

  //在指定位置的前驅插入包含對象的節點

  public void add(int index, Object theElement) {

    if (index < 0 || index > size) {

      // 非法位置

      throw new IndexOutOfBoundsException

          ("index = " + index + "  size = " + size);

    }

    if (size == index) {

      this.add(theElement);

    }

    else {

      LinkNode p = head;

      for (int i = 0; i < index; i++) {

        p = p.next;

      }

      // 插入到p之後

      p.next = new LinkNode(theElement, p.next);

      size++;

    }

  }

  //利用尾指針在鏈表最後追加數據

  public void add(Object theElement) {

    tail.next = new LinkNode(theElement, null);

    tail = tail.next;

    size++;

  }

  public String toString() {

    StringBuffer s = new StringBuffer("[");

    // 放元素到緩衝區buffer

    LinkNode p = head.next;

    while (p != null) {

      if (p.element == null) {

        s.append("null, ");

      }

      else {

        s.append(p.element.toString() + ", ");

      }

      p = p.next;

    }

    if (size > 0) {

      s.delete(s.length() - 2, s.length()); // 去掉最後一個", "

    }

    s.append("]");

    // 返回創建的等值串

    return new String(s);

  }

}

//class LinkNode

package LinkList;

class LinkNode {

  //數據成員

  LinkNode next;

  Object element;

  //構造函數

  public LinkNode() {

  }

  public LinkNode(Object element){

    this.next=null;

    this.element=element;

  }

  LinkNode(Object element, LinkNode next)

   {

      this.element = element;

      this.next = next;

   }

}

//class Test

package LinkList;

import linearlist.LinearListInterface;

public class Test {

  public Test() {

  }

  /** 測試程序*/

  public static void main(String[] args) {

    // 測試缺省的構造函數

    LinkList x = new LinkList();

    // 測試元素個數size

    System.out.println("Initial size is " + x.size());

    // 測試判空isEmpty

    if (x.isEmpty()) {

      System.out.println("The list is empty");

    }

    else {

      System.out.println("The list is not empty");

      // 測試插入add

    }

    x.add(0, new Integer(2));

    x.add(1, new Integer(6));

    x.add(0, new Integer(1));

    x.add(2, new Integer(4));

    x.add(3, new Integer(17));

    x.add(4, new Integer(14));

    x.add(new Integer(1345));

    System.out.println("List size is " + x.size());

    // 測試字符串輸出toString

    System.out.println("The list is " + x);

    //測試複製構造函數

    LinkList y=new LinkList(x);

    System.out.println("y is " + x);

    // 測試定位indexOf

    int index = x.indexOf(new Integer(4));

    if (index < 0) {

      System.out.println("4 not found");

    }

    else {

      System.out.println("The index of 4 is " + index);

    }

    index = x.indexOf(new Integer(3));

    if (index < 0) {

      System.out.println("3 not found");

    }

    else {

      System.out.println("The index of 3 is " + index);

      // 測試取得操作get

    }

    System.out.println("Element at 0 is " + x.get(0));

    System.out.println("Element at 3 is " + x.get(3));

    // 測試刪除remove

    System.out.println(x.remove(1) + " removed");

    System.out.println("The list is " + x);

    System.out.println(x.remove(2) + " removed");

    System.out.println("The list is " + x);

    // 輸出線性表當前狀態

    if (x.isEmpty()) {

      System.out.println("The list is empty");

    }

    else {

      System.out.println("The list is not empty");

    }

    System.out.println("List size is " + x.size());

  }

}

////////       Package LinkList          ///////////

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章