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)
搜索
積分與排名
積分 - 163059
排名 - 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)
主站蜘蛛池模板:
亚洲中文字幕久久无码
|
国产精品美女久久久免费
|
亚洲人成图片小说网站
|
久久免费区一区二区三波多野
|
日韩免费a级在线观看
|
二级毛片免费观看全程
|
久久夜色精品国产噜噜亚洲AV
|
毛片基地免费观看
|
亚洲精品视频免费观看
|
久久亚洲AV成人出白浆无码国产
|
无码日韩人妻av一区免费
|
一级黄色免费毛片
|
亚洲妓女综合网99
|
亚洲精品无码99在线观看
|
一级特黄aaa大片免费看
|
亚洲精品在线播放视频
|
免费永久国产在线视频
|
最近免费视频中文字幕大全
|
久久精品国产亚洲AV电影网
|
亚洲欧洲无码AV电影在线观看
|
AV无码免费永久在线观看
|
亚洲一区在线视频观看
|
亚洲一区无码精品色
|
72pao国产成视频永久免费
|
亚洲精品国产肉丝袜久久
|
无码欧精品亚洲日韩一区夜夜嗨
|
曰批免费视频播放在线看片二
|
亚洲av中文无码乱人伦在线播放
|
国产无遮挡裸体免费视频
|
外国成人网在线观看免费视频
|
亚洲av无码av在线播放
|
久久久久亚洲精品日久生情
|
亚洲午夜精品久久久久久浪潮
|
久久天天躁狠狠躁夜夜免费观看
|
精品国产免费人成网站
|
真正全免费视频a毛片
|
亚洲深深色噜噜狠狠网站
|
亚洲最大的成网4438
|
狠狠亚洲狠狠欧洲2019
|
国产精品免费_区二区三区观看
|
2019中文字幕在线电影免费
|