先介紹一下接口
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];
}
/** 重載的構造函數,缺省的initialcapacity爲10 */
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];
// size減1, 並置爲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 ///////////