JAVA基礎:語言中連結串列和雙向連結串列的實現(轉)
JAVA基礎:語言中連結串列和雙向連結串列的實現(轉)[@more@]連結串列是一種重要的資料結構,在程式設計中佔有很重要的地位。C語言和C++語言中是用指標來實現連結串列結構的,由於JAVA語言不提供指標,所以有人認為在JAVA語言中不能實現連結串列,其實不然,JAVA語言比C和C++更容易實現連結串列結構。JAVA語言中的物件引用實際上是一個指標(本文中的指標均為概念上的意義,而非語言提供的資料型別),所以我們可以編寫這樣的類來實現連結串列中的結點。
class Node
{
Object data;
Node next; // 指向下一個結點
}
將資料域定義成Object類是因為Object類是廣義超類(所有類的祖先),任何類物件都可以給其賦值,增加了程式碼的通用性。為了使連結串列可以被訪問還需要定義一個表頭,表頭必須包含指向第一個結點的指標和指向當前結點的指標。為了便於在連結串列尾部增加結點,還可以增加一指向連結串列尾部的指標,另外還可以用一個域來表示連結串列的大小,當呼叫者想得到連結串列的大小時,不必遍歷整個連結串列,下圖是這種連結串列的示意圖。
圖一 連結串列的資料結構
我們可以用類List來實現連結串列結構,用變數Head、Tail、Length、Pointer來實現表頭。儲存當前結點的指標時有一定的技巧,Pointer並非儲存指向當前結點的指標,而是儲存指向它的前趨結點的指標,當其值為null時表示當前結點是第一個結點。那麼我們為什麼要這樣做呢?這是因為當我們刪除當前結點後仍需保證剩下的結點構成連結串列,如果Pointer指向當前結點,則會給操作帶來很大困難。那麼如何得到當前結點呢,我們定義了一個方法cursor(),返回值是指向當前結點的指標。類List還定義了一些方法來實現對連結串列的基本操作,透過運用這些基本操作我們可以對連結串列進行各種操作。例如reset()方法使第一個結點成為當前結點。insert( Object d )方法在當前結點前插入一個結點,並使其成為當前結點。remove()方法刪除當前結點同時返回其內容,並使其後繼結點成為當前結點,如果刪除的是最後一個結點,則第一個結點變為當前結點。
連結串列類List的原始碼如下:
import java.io.*;
public class List
{
/* 用變數來實現表頭 */
private Node Head=null;
private Node Tail=null;
private Node Pointer=null;
private int Length = 0;
public void deleteAll()
/* 清空整個連結串列 */
{
Head = null;
Tail = null;
Pointer = null;
Length = 0;
}
public void reset()
/* 連結串列復位,使第一個結點成為當前結點 */
{
Pointer = null;
}
public boolean isEmpty( )
/* 判斷連結串列是否為空 */
{
return( Length == 0 );
}
public boolean isEnd()
/* 判斷當前結點是否為最後一個結點 */
{
if ( Length == 0 )
throw new java.lang.NullPointerException();
else if ( Length == 1 )
return true;
else
return( cursor() == Tail );
}
public Object nextNode()
/* 返回當前結點的下一個結點的值,並使其成為當前結點 */
{
if ( Length == 1 )
throw new java.util.NoSuchElementException();
else if ( Length == 0 )
throw new java.lang.NullPointerException();
else
{
Node temp = cursor();
Pointer = temp;
if ( temp != Tail )
return( temp.next.data );
else
throw new java.util.NoSuchElementException();
}
}
public Object currentNode()
/* 返回當前結點的值 */
{
Node temp = cursor();
return temp.data;
}
public void insert( Object d )
/* 在當前結點前插入一個結點,並使其成為當前結點 */
{
Node e = new Node( d );
if ( Length == 0 )
{
Tail = e;
Head = e;
}
else
{
Node temp = cursor();
e.next = temp;
if ( Pointer == null )
Head = e;
else
Pointer.next = e;
}
Length++;
}
public int size()
/* 返回連結串列的大小 */
{
return ( Length );
}
class Node
{
Object data;
Node next; // 指向下一個結點
}
將資料域定義成Object類是因為Object類是廣義超類(所有類的祖先),任何類物件都可以給其賦值,增加了程式碼的通用性。為了使連結串列可以被訪問還需要定義一個表頭,表頭必須包含指向第一個結點的指標和指向當前結點的指標。為了便於在連結串列尾部增加結點,還可以增加一指向連結串列尾部的指標,另外還可以用一個域來表示連結串列的大小,當呼叫者想得到連結串列的大小時,不必遍歷整個連結串列,下圖是這種連結串列的示意圖。
圖一 連結串列的資料結構
我們可以用類List來實現連結串列結構,用變數Head、Tail、Length、Pointer來實現表頭。儲存當前結點的指標時有一定的技巧,Pointer並非儲存指向當前結點的指標,而是儲存指向它的前趨結點的指標,當其值為null時表示當前結點是第一個結點。那麼我們為什麼要這樣做呢?這是因為當我們刪除當前結點後仍需保證剩下的結點構成連結串列,如果Pointer指向當前結點,則會給操作帶來很大困難。那麼如何得到當前結點呢,我們定義了一個方法cursor(),返回值是指向當前結點的指標。類List還定義了一些方法來實現對連結串列的基本操作,透過運用這些基本操作我們可以對連結串列進行各種操作。例如reset()方法使第一個結點成為當前結點。insert( Object d )方法在當前結點前插入一個結點,並使其成為當前結點。remove()方法刪除當前結點同時返回其內容,並使其後繼結點成為當前結點,如果刪除的是最後一個結點,則第一個結點變為當前結點。
連結串列類List的原始碼如下:
import java.io.*;
public class List
{
/* 用變數來實現表頭 */
private Node Head=null;
private Node Tail=null;
private Node Pointer=null;
private int Length = 0;
public void deleteAll()
/* 清空整個連結串列 */
{
Head = null;
Tail = null;
Pointer = null;
Length = 0;
}
public void reset()
/* 連結串列復位,使第一個結點成為當前結點 */
{
Pointer = null;
}
public boolean isEmpty( )
/* 判斷連結串列是否為空 */
{
return( Length == 0 );
}
public boolean isEnd()
/* 判斷當前結點是否為最後一個結點 */
{
if ( Length == 0 )
throw new java.lang.NullPointerException();
else if ( Length == 1 )
return true;
else
return( cursor() == Tail );
}
public Object nextNode()
/* 返回當前結點的下一個結點的值,並使其成為當前結點 */
{
if ( Length == 1 )
throw new java.util.NoSuchElementException();
else if ( Length == 0 )
throw new java.lang.NullPointerException();
else
{
Node temp = cursor();
Pointer = temp;
if ( temp != Tail )
return( temp.next.data );
else
throw new java.util.NoSuchElementException();
}
}
public Object currentNode()
/* 返回當前結點的值 */
{
Node temp = cursor();
return temp.data;
}
public void insert( Object d )
/* 在當前結點前插入一個結點,並使其成為當前結點 */
{
Node e = new Node( d );
if ( Length == 0 )
{
Tail = e;
Head = e;
}
else
{
Node temp = cursor();
e.next = temp;
if ( Pointer == null )
Head = e;
else
Pointer.next = e;
}
Length++;
}
public int size()
/* 返回連結串列的大小 */
{
return ( Length );
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-959762/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java實現雙向連結串列Java
- 連結串列-雙向連結串列
- 實現雙向連結串列
- 連結串列-雙向通用連結串列
- 連結串列-雙向非通用連結串列
- Go實現雙向連結串列Go
- 雙向連結串列
- 雙向連結串列的功能實現(初版
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構(雙向連結串列的實現)資料結構
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 連結串列 - 單向連結串列
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- java實現連結串列反轉Java
- 圖解雙連結串列(Java實現)圖解Java
- 連結串列-單連結串列實現
- 資料結構-雙向連結串列(Python實現)資料結構Python
- c語言單向連結串列逆轉實現方法C語言
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 資料結構——雙向連結串列資料結構
- go 實現單向連結串列Go
- 019 透過連結串列學Rust之雙連結串列實現PeekRust
- 019 通過連結串列學Rust之雙連結串列實現PeekRust
- 資料結構-單連結串列、雙連結串列資料結構
- 連結串列基礎總結
- 請使用 js 實現一個雙向連結串列JS
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript
- 雙向連結串列介面設計(C語言)C語言
- 畫江湖之資料結構【第一話:連結串列】雙向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 雙向連結串列資料結構
- 演算法與資料結構-連結串列((linked-list)-Java實現單向連結串列演算法資料結構Java
- 資料結構之雙向連結串列資料結構
- 資料結構_連結串列_雙向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 連結串列基礎2(超簡單)--單連結串列的插入和刪除
- 實戰PHP資料結構基礎之雙連結串列PHP資料結構
- TypeScript 實現連結串列反轉TypeScript
- 單向迴圈連結串列的實現
- #反轉連結串列_C++版 #反轉連結串列_Java版 @FDDLCC++Java