kooyee ‘s blog
開源軟件, 眾人努力的結晶, 全人類的共同財富
posts - 103, comments - 55, trackbacks - 0, articles - 66
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
[J2SE] Java語言中鏈表和雙向鏈表的實現
Posted on 2007-08-02 00:04
kooyee
閱讀(241)
評論(0)
編輯
收藏
所屬分類:
Java
鏈表是一種重要的數據結構,在程序設計中占有很重要的地位。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);
}
public
Object remove()
/**/
/*
將當前結點移出鏈表,下一個結點成為當前結點,如果移出的結點是最后一個結點,則第一個結點成為當前結點
*/
{
Object temp;
if
(Length
==
0
)
throw
new
java.util.NoSuchElementException();
else
if
(Length
==
1
)
{
temp
=
Head.data;
deleteAll();
}
else
{
Node cur
=
cursor();
temp
=
cur.data;
if
(cur
==
Head)
Head
=
cur.next;
else
if
(cur
==
Tail)
{
Pointer.next
=
null
;
Tail
=
Pointer;
reset();
}
else
Pointer.next
=
cur.next;
Length--;
}
return
temp;
}
private
Node cursor()
/**/
/*
返回當前結點的指針
*/
{
if
(Head
==
null
)
throw
new
java.lang.NullPointerException();
else
if
(Pointer
==
null
)
return
Head;
else
return
Pointer.next;
}
public
static
void
main(String[] args)
/**/
/*
鏈表的簡單應用舉例
*/
{
List a
=
new
List ();
for
(
int
i
=
1
;i
&
lt;
=
10
;i++)
a.insert(
new
Integer(i));
System.out.println(a.currentNode());
while
(
!
a.isEnd())
System.out.println(a.nextNode());
a.reset();
while
(
!
a.isEnd())
{
a.remove();
}
a.remove();
a.reset();
if
(a.isEmpty())
System.out.println(
"
There is no Node in List \n
"
);
System.in.println(
"
You can press return to quit\n
"
);
try
{
System.in.read();
//
確保用戶看清程序運行結果
}
catch
(IOException e)
{}
}
}
class
Node
/**/
/*
構成鏈表的結點定義
*/
{
Object data;
Node next;
Node(Object d)
{
data
=
d;
next
=
null
;
}
}
讀者還可以根據實際需要定義新的方法來對鏈表進行操作。雙向鏈表可以用類似的方法實現只是結點的類增加了一個指向前趨結點的指針。
可以用這樣的代碼來實現:
class
Node
{
Object data;
Node next;
Node previous;
Node(Object d)
{
data
=
d;
next
=
null
;
previous
=
null
;
}
}
當然,雙向鏈表基本操作的實現略有不同。鏈表和雙向鏈表的實現方法,也可以用在堆棧和隊列的實現中,這里就不再多寫了,有興趣的讀者可以將List類的代碼稍加改動即可。
參考文獻:《網絡編程語言JAVA》 孫淑玲、王太權、陳意云
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
[java] JavaMail快速入門
[Java] JavaMail(JAVA郵件服務) API詳解
[J2SE] Java語言中鏈表和雙向鏈表的實現
[J2SE] Java容器類List和Set
[J2SE] For-each 循環
[J2SE] File 操作
[J2SE] 對Image的操作
[Java.lang]String.split用法
[JDBC]調用Database function - Oracle
Java Classpath全解
Powered by:
BlogJava
Copyright © kooyee
日歷
<
2025年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
公告
一起暢游計算機的世界
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(7)
給我留言
查看公開留言
查看私人留言
隨筆分類
AI 人工智能(1)
Ajax學習手記(2)
C/C++(1)
Database數據庫技術(4)
Groovy on Grails(1)
GUI骨衣 (6)
J2EE(1)
Jasper Report (2)
Java (15)
Lniux/Unix (14)
Regular Expression正則表達式
Software(1)
Software Engineering 軟件工程(2)
Swing/Applet(19)
Web Design網頁設計 (4)
Web Framework 網絡框架(1)
Windows (2)
Wireless Ad-hoc and sensor network(4)
開源 OpenSource(1)
隨筆檔案
2009年1月 (1)
2008年12月 (3)
2008年11月 (3)
2008年10月 (2)
2008年7月 (2)
2008年6月 (22)
2008年5月 (3)
2008年4月 (2)
2008年3月 (10)
2008年2月 (14)
2008年1月 (5)
2007年12月 (6)
2007年11月 (5)
2007年10月 (5)
2007年9月 (2)
2007年8月 (17)
搜索
積分與排名
積分 - 162964
排名 - 363
最新評論
1.?re: SUM, COUNT 等在 jasper report 中使用方法
<javascript language="java"> alert("aaaa")</javascript>
--sd
2.?re: 【Bug】當調用nam時錯誤
怎么重裝ns-2.33
--雨中蝶
3.?re: [SWT] SWT table中select item以及添加其他control(checkbox, button)
如果要加的CheckBox很多的話,會不會速度很慢呢?
--問路
4.?re: [JAVA] 使用xsl來動態生成java代碼
評論內容較長,點擊標題查看
--cosplay
5.?re: 『Java』java.lang.UnsupportedOperationException at java.util.AbstractLis
api 的設計多此一舉還搞個內部類
--冬天雞雞好冷
閱讀排行榜
1.? VB使用WebBrowser讀取網頁內容(12238)
2.?【Simulator】Cygwin下NS2安裝和配置(3651)
3.?什么是*.ps文件(3591)
4.?『Java』java.lang.UnsupportedOperationException at java.util.AbstractLis(3551)
5.?【linux腳本】bad interpreter: No such file or directory(3380)
主站蜘蛛池模板:
色妞WWW精品免费视频
|
国产亚洲精品看片在线观看
|
亚洲av无一区二区三区
|
亚洲综合久久夜AV
|
亚洲无砖砖区免费
|
老湿机一区午夜精品免费福利
|
亚洲色WWW成人永久网址
|
青娱乐免费视频在线观看
|
国产成人va亚洲电影
|
内射少妇36P亚洲区
|
免费一级毛片在线播放不收费
|
污污网站免费观看
|
精品国产日韩亚洲一区91
|
久久久久亚洲精品影视
|
国产在线98福利播放视频免费
|
羞羞网站免费观看
|
黑人精品videos亚洲人
|
特级淫片国产免费高清视频
|
免费国产午夜高清在线视频
|
日韩亚洲人成网站
|
亚洲国产av一区二区三区丶
|
亚洲精品无码久久久影院相关影片
|
自拍日韩亚洲一区在线
|
亚洲精品制服丝袜四区
|
日本xxwwxxww在线视频免费
|
亚洲视频免费在线观看
|
国产精品美女久久久免费
|
亚洲第一se情网站
|
亚洲无成人网77777
|
国产亚洲精品观看91在线
|
国产jizzjizz视频免费看
|
99久久久精品免费观看国产
|
国产成人一区二区三区视频免费
|
免费夜色污私人影院网站电影
|
亚洲精品美女在线观看
|
国产亚洲综合久久系列
|
亚洲毛片网址在线观看中文字幕
|
在线精品免费视频无码的
|
亚洲爱情岛论坛永久
|
亚洲欧洲精品成人久久奇米网
|
日本视频免费在线
|