程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 簡略引見線性表和若何完成雙鏈表

簡略引見線性表和若何完成雙鏈表

編輯:關於JAVA

簡略引見線性表和若何完成雙鏈表。本站提示廣大學習愛好者:(簡略引見線性表和若何完成雙鏈表)文章只能為提供參考,不一定能成為您想要的結果。以下是簡略引見線性表和若何完成雙鏈表正文


線性表是一種線性構造,它是具有雷同類型的n(n≥0)個數據元素構成的無限序列。

1、數組
數組有上界和下界,數組的元素在高低界內是持續的。

存儲10,20,30,40,50的數組的表示圖以下:

數組的特色:數據是持續的;隨機拜訪速度快。
數組中略微龐雜一點的是多維數組和靜態數組。關於C說話而言,多維數組實質上也是經由過程一維數組完成的。至於靜態數組,是指數組的容量能靜態增加的數組;關於C說話而言,若要供給靜態數組,須要手動完成;而關於C++而言,STL供給了Vector;關於Java而言,Collection聚集中供給了ArrayList和Vector。

2、單向鏈表
單向鏈表(單鏈表)是鏈表的一種,它由節點構成,每一個節點都包括下一個節點的指針。

單鏈表的表示圖以下:

表頭為空,表頭的後繼節點是"節點10"(數據為10的節點),"節點10"的後繼節點是"節點20"(數據為10的節點),...

單鏈表刪除節點

刪除"節點30"
刪除之前:"節點20" 的後繼節點為"節點30",而"節點30" 的後繼節點為"節點40"。
刪除以後:"節點20" 的後繼節點為"節點40"。

單鏈表添加節點

在"節點10"與"節點20"之間添加"節點15"
添加上前:"節點10" 的後繼節點為"節點20"。
添加上後:"節點10" 的後繼節點為"節點15",而"節點15" 的後繼節點為"節點20"。

單鏈表的特色是:節點的鏈接偏向是單向的;絕對於數組來講,單鏈表的的隨機拜訪速度較慢,然則單鏈表刪除/添加數據的效力很高。

3、雙向鏈表
雙向鏈表(雙鏈表)是鏈表的一種。和單鏈表一樣,雙鏈表也是由節點構成,它的每一個數據結點中都有兩個指針,分離指向直接後繼和直接先驅。所以,從雙向鏈表中的隨意率性一個結點開端,都可以很便利地拜訪它的先驅結點和後繼結點。普通我們都結構雙向輪回鏈表。

雙鏈表的表示圖以下:

表頭為空,表頭的後繼節點為"節點10"(數據為10的節點);"節點10"的後繼節點是"節點20"(數據為10的節點),"節點20"的前繼節點是"節點10";"節點20"的後繼節點是"節點30","節點30"的前繼節點是"節點20";...;末尾節點的後繼節點是表頭。

雙鏈表刪除節點

刪除"節點30"
刪除之前:"節點20"的後繼節點為"節點30","節點30" 的前繼節點為"節點20"。"節點30"的後繼節點為"節點40","節點40" 的前繼節點為"節點30"。
刪除以後:"節點20"的後繼節點為"節點40","節點40" 的前繼節點為"節點20"。

雙鏈表添加節點

在"節點10"與"節點20"之間添加"節點15"
添加上前:"節點10"的後繼節點為"節點20","節點20" 的前繼節點為"節點10"。
添加上後:"節點10"的後繼節點為"節點15","節點15" 的前繼節點為"節點10"。"節點15"的後繼節點為"節點20","節點20" 的前繼節點為"節點15"。

上面引見雙鏈表的完成,分離引見C/C++/Java三種完成。

1. C完成雙鏈表

完成代碼
雙向鏈表頭文件(double_link.h)

#ifndef _DOUBLE_LINK_H
#define _DOUBLE_LINK_H
// 新建“雙向鏈表”。勝利,前往表頭;不然,前往NULL
extern int create_dlink();
// 撤消“雙向鏈表”。勝利,前往0;不然,前往-1
extern int destroy_dlink();
// “雙向鏈表能否為空”。為空的話前往1;不然,前往0。
extern int dlink_is_empty();
// 前往“雙向鏈表的年夜小”
extern int dlink_size();
// 獲得“雙向鏈表中第index地位的元素”。勝利,前往節點指針;不然,前往NULL。
extern void* dlink_get(int index);
// 獲得“雙向鏈表中第1個元素”。勝利,前往節點指針;不然,前往NULL。
extern void* dlink_get_first();
// 獲得“雙向鏈表中最初1個元素”。勝利,前往節點指針;不然,前往NULL。
extern void* dlink_get_last();
// 將“value”拔出到index地位。勝利,前往0;不然,前往-1。
extern int dlink_insert(int index, void *pval);
// 將“value”拔出到表頭地位。勝利,前往0;不然,前往-1。
extern int dlink_insert_first(void *pval);
// 將“value”拔出到末尾地位。勝利,前往0;不然,前往-1。
extern int dlink_append_last(void *pval);
// 刪除“雙向鏈表中index地位的節點”。勝利,前往0;不然,前往-1
extern int dlink_delete(int index);
// 刪除第一個節點。勝利,前往0;不然,前往-1
extern int dlink_delete_first();
// 刪除組後一個節點。勝利,前往0;不然,前往-1
extern int dlink_delete_last();
#endif

雙向鏈表完成文件(double_link.c)

#include <stdio.h>
#include <malloc.h>
/**
* C 說話完成的雙向鏈表,能存儲隨意率性數據。
*
* @author skywang
* @date 2013/11/07
*/
// 雙向鏈表節點
typedef struct tag_node
{
struct tag_node *prev;
struct tag_node *next;
void* p;
}node;
// 表頭。留意,表頭不寄存元素值!!!
static node *phead=NULL;
// 節點個數。
static int count=0;
// 新建“節點”。勝利,前往節點指針;不然,前往NULL。
static node* create_node(void *pval)
{
node *pnode=NULL;
pnode = (node *)malloc(sizeof(node));
if (!pnode)
{
printf("create node error!\n");
return NULL;
}
// 默許的,pnode的前一節點和後一節點都指向它本身
pnode->prev = pnode->next = pnode;
// 節點的值為pval
pnode->p = pval;
return pnode;
}
// 新建“雙向鏈表”。勝利,前往0;不然,前往-1。
int create_dlink()
{
// 創立表頭
phead = create_node(NULL);
if (!phead)
return -1;
// 設置“節點個數”為0
count = 0;
return 0;
}
// “雙向鏈表能否為空”
int dlink_is_empty()
{
return count == 0;
}
// 前往“雙向鏈表的年夜小”
int dlink_size() {
return count;
}
// 獲得“雙向鏈表中第index地位的節點”
static node* get_node(int index)
{
if (index<0 || index>=count)
{
printf("%s failed! index out of bound!\n", __func__);
return NULL;
}
// 正向查找
if (index <= (count/2))
{
int i=0;
node *pnode=phead->next;
while ((i++) < index)
pnode = pnode->next;
return pnode;
}
// 反向查找
int j=0;
int rindex = count - index - 1;
node *rnode=phead->prev;
while ((j++) < rindex)
rnode = rnode->prev;
return rnode;
}
// 獲得“第一個節點”
static node* get_first_node()
{
return get_node(0);
}
// 獲得“最初一個節點”
static node* get_last_node()
{
return get_node(count-1);
}
// 獲得“雙向鏈表中第index地位的元素”。勝利,前往節點值;不然,前往-1。
void* dlink_get(int index)
{
node *pindex=get_node(index);
if (!pindex)
{
printf("%s failed!\n", __func__);
return NULL;
}
return pindex->p;
}
// 獲得“雙向鏈表中第1個元素的值”
void* dlink_get_first()
{
return dlink_get(0);
}
// 獲得“雙向鏈表中最初1個元素的值”
void* dlink_get_last()
{
return dlink_get(count-1);
}
// 將“pval”拔出到index地位。勝利,前往0;不然,前往-1。
int dlink_insert(int index, void* pval)
{
// 拔出表頭
if (index==0)
return dlink_insert_first(pval);
// 獲得要拔出的地位對應的節點
node *pindex=get_node(index);
if (!pindex)
return -1;
// 創立“節點”
node *pnode=create_node(pval);
if (!pnode)
return -1;
pnode->prev = pindex->prev;
pnode->next = pindex;
pindex->prev->next = pnode;
pindex->prev = pnode;
// 節點個數+1
count++;
return 0;
}
// 將“pval”拔出到表頭地位
int dlink_insert_first(void *pval)
{
node *pnode=create_node(pval);
if (!pnode)
return -1;
pnode->prev = phead;
pnode->next = phead->next;
phead->next->prev = pnode;
phead->next = pnode;
count++;
return 0;
}
// 將“pval”拔出到末尾地位
int dlink_append_last(void *pval)
{
node *pnode=create_node(pval);
if (!pnode)
return -1;

pnode->next = phead;
pnode->prev = phead->prev;
phead->prev->next = pnode;
phead->prev = pnode;
count++;
return 0;
}
// 刪除“雙向鏈表中index地位的節點”。勝利,前往0;不然,前往-1。
int dlink_delete(int index)
{
node *pindex=get_node(index);
if (!pindex)
{
printf("%s failed! the index in out of bound!\n", __func__);
return -1;
}
pindex->next->prev = pindex->prev;
pindex->prev->next = pindex->next;
free(pindex);
count--;
return 0;
}
// 刪除第一個節點
int dlink_delete_first()
{
return dlink_delete(0);
}
// 刪除組後一個節點
int dlink_delete_last()
{
return dlink_delete(count-1);
}
// 撤消“雙向鏈表”。勝利,前往0;不然,前往-1。
int destroy_dlink()
{
if (!phead)
{
printf("%s failed! dlink is null!\n", __func__);
return -1;
}
node *pnode=phead->next;
node *ptmp=NULL;
while(pnode != phead)
{
ptmp = pnode;
pnode = pnode->next;
free(ptmp);
}
free(phead);
phead = NULL;
count = 0;
return 0;
}

雙向鏈表測試法式(dlink_test.c)

#include <stdio.h>
#include "double_link.h"
/**
* C 說話完成的雙向鏈表的測試法式。
*
* (01) int_test()
* 演示向雙向鏈表操作“int數據”。
* (02) string_test()
* 演示向雙向鏈表操作“字符串數據”。
* (03) object_test()
* 演示向雙向鏈表操作“對象”。
*
* @author skywang
* @date 2013/11/07
*/
// 雙向鏈表操作int數據
void int_test()
{
int iarr[4] = {10, 20, 30, 40};
printf("\n----%s----\n", __func__);
create_dlink(); // 創立雙向鏈表
dlink_insert(0, &iarr[0]); // 向雙向鏈表的表頭拔出數據
dlink_insert(0, &iarr[1]); // 向雙向鏈表的表頭拔出數據
dlink_insert(0, &iarr[2]); // 向雙向鏈表的表頭拔出數據
printf("dlink_is_empty()=%d\n", dlink_is_empty()); // 雙向鏈表能否為空
printf("dlink_size()=%d\n", dlink_size()); // 雙向鏈表的年夜小
// 打印雙向鏈表中的全體數據
int i;
int *p;
int sz = dlink_size();
for (i=0; i<sz; i++)
{
p = (int *)dlink_get(i);
printf("dlink_get(%d)=%d\n", i, *p);
}
destroy_dlink();
}
void string_test()
{
char* sarr[4] = {"ten", "twenty", "thirty", "forty"};
printf("\n----%s----\n", __func__);
create_dlink(); // 創立雙向鏈表
dlink_insert(0, sarr[0]); // 向雙向鏈表的表頭拔出數據
dlink_insert(0, sarr[1]); // 向雙向鏈表的表頭拔出數據
dlink_insert(0, sarr[2]); // 向雙向鏈表的表頭拔出數據
printf("dlink_is_empty()=%d\n", dlink_is_empty()); // 雙向鏈表能否為空
printf("dlink_size()=%d\n", dlink_size()); // 雙向鏈表的年夜小
// 打印雙向鏈表中的全體數據
int i;
char *p;
int sz = dlink_size();
for (i=0; i<sz; i++)
{
p = (char *)dlink_get(i);
printf("dlink_get(%d)=%s\n", i, p);
}
destroy_dlink();
}
typedef struct tag_stu
{
int id;
char name[20];
}stu;
static stu arr_stu[] =
{
{10, "sky"},
{20, "jody"},
{30, "vic"},
{40, "dan"},
};
#define ARR_STU_SIZE ( (sizeof(arr_stu)) / (sizeof(arr_stu[0])) )
void object_test()
{
printf("\n----%s----\n", __func__);
create_dlink(); // 創立雙向鏈表
dlink_insert(0, &arr_stu[0]); // 向雙向鏈表的表頭拔出數據
dlink_insert(0, &arr_stu[1]); // 向雙向鏈表的表頭拔出數據
dlink_insert(0, &arr_stu[2]); // 向雙向鏈表的表頭拔出數據
printf("dlink_is_empty()=%d\n", dlink_is_empty()); // 雙向鏈表能否為空
printf("dlink_size()=%d\n", dlink_size()); // 雙向鏈表的年夜小
// 打印雙向鏈表中的全體數據
int i;
int sz = dlink_size();
stu *p;
for (i=0; i<sz; i++)
{
p = (stu *)dlink_get(i);
printf("dlink_get(%d)=[%d, %s]\n", i, p->id, p->name);
}
destroy_dlink();
}
int main()
{
int_test(); // 演示向雙向鏈表操作“int數據”。
string_test(); // 演示向雙向鏈表操作“字符串數據”。
object_test(); // 演示向雙向鏈表操作“對象”。
return 0;
}

運轉成果

----int_test----
dlink_is_empty()=0
dlink_size()=3
dlink_get(0)=30
dlink_get(1)=20
dlink_get(2)=10
----string_test----
dlink_is_empty()=0
dlink_size()=3
dlink_get(0)=thirty
dlink_get(1)=twenty
dlink_get(2)=ten
----object_test----
dlink_is_empty()=0
dlink_size()=3
dlink_get(0)=[30, vic]
dlink_get(1)=[20, jody]
dlink_get(2)=[10, sky]

2. C++完成雙鏈表

完成代碼
雙向鏈表文件(DoubleLink.h)

#ifndef DOUBLE_LINK_HXX
#define DOUBLE_LINK_HXX
#include <iostream>
using namespace std;
template<class T>
struct DNode
{
public:
T value;
DNode *prev;
DNode *next;
public:
DNode() { }
DNode(T t, DNode *prev, DNode *next) {
this->value = t;
this->prev = prev;
this->next = next;
}
};
template<class T>
class DoubleLink
{
public:
DoubleLink();
~DoubleLink();
int size();
int is_empty();
T get(int index);
T get_first();
T get_last();
int insert(int index, T t);
int insert_first(T t);
int append_last(T t);
int del(int index);
int delete_first();
int delete_last();
private:
int count;
DNode<T> *phead;
private:
DNode<T> *get_node(int index);
};
template<class T>
DoubleLink<T>::DoubleLink() : count(0)
{
// 創立“表頭”。留意:表頭沒有存儲數據!
phead = new DNode<T>();
phead->prev = phead->next = phead;
// 設置鏈表計數為0
//count = 0;
}
// 析構函數
template<class T>
DoubleLink<T>::~DoubleLink()
{
// 刪除一切的節點
DNode<T>* ptmp;
DNode<T>* pnode = phead->next;
while (pnode != phead)
{
ptmp = pnode;
pnode=pnode->next;
delete ptmp;
}
// 刪除"表頭"
delete phead;
phead = NULL;
}
// 前往節點數量
template<class T>
int DoubleLink<T>::size()
{
return count;
}
// 前往鏈表能否為空
template<class T>
int DoubleLink<T>::is_empty()
{
return count==0;
}
// 獲得第index地位的節點
template<class T>
DNode<T>* DoubleLink<T>::get_node(int index)
{
// 斷定參數有用性
if (index<0 || index>=count)
{
cout << "get node failed! the index in out of bound!" << endl;
return NULL;
}
// 正向查找
if (index <= count/2)
{
int i=0;
DNode<T>* pindex = phead->next;
while (i++ < index) {
pindex = pindex->next;
}
return pindex;
}
// 反向查找
int j=0;
int rindex = count - index -1;
DNode<T>* prindex = phead->prev;
while (j++ < rindex) {
prindex = prindex->prev;
}
return prindex;
}
// 獲得第index地位的節點的值
template<class T>
T DoubleLink<T>::get(int index)
{
return get_node(index)->value;
}
// 獲得第1個節點的值
template<class T>
T DoubleLink<T>::get_first()
{
return get_node(0)->value;
}
// 獲得最初一個節點的值
template<class T>
T DoubleLink<T>::get_last()
{
return get_node(count-1)->value;
}
// 將節點拔出到第index地位之前
template<class T>
int DoubleLink<T>::insert(int index, T t)
{
if (index == 0)
return insert_first(t);
DNode<T>* pindex = get_node(index);
DNode<T>* pnode = new DNode<T>(t, pindex->prev, pindex);
pindex->prev->next = pnode;
pindex->prev = pnode;
count++;
return 0;
}
// 將節點拔出第一個節點處。
template<class T>
int DoubleLink<T>::insert_first(T t)
{
DNode<T>* pnode = new DNode<T>(t, phead, phead->next);
phead->next->prev = pnode;
phead->next = pnode;
count++;
return 0;
}
// 將節點追加到鏈表的末尾
template<class T>
int DoubleLink<T>::append_last(T t)
{
DNode<T>* pnode = new DNode<T>(t, phead->prev, phead);
phead->prev->next = pnode;
phead->prev = pnode;
count++;
return 0;
}
// 刪除index地位的節點
template<class T>
int DoubleLink<T>::del(int index)
{
DNode<T>* pindex = get_node(index);
pindex->next->prev = pindex->prev;
pindex->prev->next = pindex->next;
delete pindex;
count--;
return 0;
}
// 刪除第一個節點
template<class T>
int DoubleLink<T>::delete_first()
{
return del(0);
}
// 刪除最初一個節點
template<class T>
int DoubleLink<T>::delete_last()
{
return del(count-1);
}
#endif

雙向鏈表測試文件(DlinkTest.cpp)

#include <iostream>
#include "DoubleLink.h"
using namespace std;
// 雙向鏈表操作int數據
void int_test()
{
int iarr[4] = {10, 20, 30, 40};
cout << "\n----int_test----" << endl;
// 創立雙向鏈表
DoubleLink<int>* pdlink = new DoubleLink<int>();
pdlink->insert(0, 20); // 將 20 拔出到第一個地位
pdlink->append_last(10); // 將 10 追加到鏈表末尾
pdlink->insert_first(30); // 將 30 拔出到第一個地位
// 雙向鏈表能否為空
cout << "is_empty()=" << pdlink->is_empty() <<endl;
// 雙向鏈表的年夜小
cout << "size()=" << pdlink->size() <<endl;
// 打印雙向鏈表中的全體數據
int sz = pdlink->size();
for (int i=0; i<sz; i++)
cout << "pdlink("<<i<<")=" << pdlink->get(i) <<endl;
}
void string_test()
{
string sarr[4] = {"ten", "twenty", "thirty", "forty"};
cout << "\n----string_test----" << endl;
// 創立雙向鏈表
DoubleLink<string>* pdlink = new DoubleLink<string>();
pdlink->insert(0, sarr[1]); // 將 sarr中第2個元素 拔出到第一個地位
pdlink->append_last(sarr[0]); // 將 sarr中第1個元素 追加到鏈表末尾
pdlink->insert_first(sarr[2]); // 將 sarr中第3個元素 拔出到第一個地位
// 雙向鏈表能否為空
cout << "is_empty()=" << pdlink->is_empty() <<endl;
// 雙向鏈表的年夜小
cout << "size()=" << pdlink->size() <<endl;
// 打印雙向鏈表中的全體數據
int sz = pdlink->size();
for (int i=0; i<sz; i++)
cout << "pdlink("<<i<<")=" << pdlink->get(i) <<endl;
}
struct stu
{
int id;
char name[20];
};
static stu arr_stu[] =
{
{10, "sky"},
{20, "jody"},
{30, "vic"},
{40, "dan"},
};
#define ARR_STU_SIZE ( (sizeof(arr_stu)) / (sizeof(arr_stu[0])) )
void object_test()
{
cout << "\n----object_test----" << endl;
// 創立雙向鏈表
DoubleLink<stu>* pdlink = new DoubleLink<stu>();
pdlink->insert(0, arr_stu[1]); // 將 arr_stu中第2個元素 拔出到第一個地位
pdlink->append_last(arr_stu[0]); // 將 arr_stu中第1個元素 追加到鏈表末尾
pdlink->insert_first(arr_stu[2]); // 將 arr_stu中第3個元素 拔出到第一個地位
// 雙向鏈表能否為空
cout << "is_empty()=" << pdlink->is_empty() <<endl;
// 雙向鏈表的年夜小
cout << "size()=" << pdlink->size() <<endl;
// 打印雙向鏈表中的全體數據
int sz = pdlink->size();
struct stu p;
for (int i=0; i<sz; i++)
{
p = pdlink->get(i);
cout << "pdlink("<<i<<")=[" << p.id << ", " << p.name <<"]" <<endl;
}
}
int main()
{
int_test(); // 演示向雙向鏈表操作“int數據”。
string_test(); // 演示向雙向鏈表操作“字符串數據”。
object_test(); // 演示向雙向鏈表操作“對象”。
return 0;
}

示例解釋

在下面的示例中,我將雙向鏈表的"聲明"和"完成"都放在頭文件中。而編程標准申饬我們:將類的聲明和完成分別,在頭文件(.h文件或.hpp)中盡可能只包括聲明,而在完成文件(.cpp文件)中擔任完成!
那末為何要這麼做呢?這是由於,在雙向鏈表的完成中,采取了模板;而C++編譯器不支撐對模板的分別式編譯!簡略點說,假如在DoubleLink.h中聲明,而在DoubleLink.cpp中停止完成的話;當我們在其他類中創立DoubleLink的對象時,會編譯失足。詳細緣由,可以參考"為何C++編譯器不克不及支撐對模板的分別式編譯"。

運轉成果

----int_test----
is_empty()=0
size()=3
pdlink(0)=30
pdlink(1)=20
pdlink(2)=10
----string_test----
is_empty()=0
size()=3
pdlink(0)=thirty
pdlink(1)=twenty
pdlink(2)=ten
----object_test----
is_empty()=0
size()=3
pdlink(0)=[30, vic]
pdlink(1)=[20, jody]
pdlink(2)=[10, sky]

3. Java完成雙鏈表

完成代碼
雙鏈表類(DoubleLink.java)

/**
* Java 完成的雙向鏈表。
* 注:java自帶的聚集包中有完成雙向鏈表,途徑是:java.util.LinkedList
*
* @author skywang
* @date 2013/11/07
*/
public class DoubleLink<T> {
// 表頭
private DNode<T> mHead;
// 節點個數
private int mCount;
// 雙向鏈表“節點”對應的構造體
private class DNode<T> {
public DNode prev;
public DNode next;
public T value;
public DNode(T value, DNode prev, DNode next) {
this.value = value;
this.prev = prev;
this.next = next;
}
}
// 結構函數
public DoubleLink() {
// 創立“表頭”。留意:表頭沒有存儲數據!
mHead = new DNode<T>(null, null, null);
mHead.prev = mHead.next = mHead;
// 初始化“節點個數”為0
mCount = 0;
}
// 前往節點數量
public int size() {
return mCount;
}
// 前往鏈表能否為空
public boolean isEmpty() {
return mCount==0;
}
// 獲得第index地位的節點
private DNode<T> getNode(int index) {
if (index<0 || index>=mCount)
throw new IndexOutOfBoundsException();
// 正向查找
if (index <= mCount/2) {
DNode<T> node = mHead.next;
for (int i=0; i<index; i++)
node = node.next;
return node;
}
// 反向查找
DNode<T> rnode = mHead.prev;
int rindex = mCount - index -1;
for (int j=0; j<rindex; j++)
rnode = rnode.prev;
return rnode;
}
// 獲得第index地位的節點的值
public T get(int index) {
return getNode(index).value;
}
// 獲得第1個節點的值
public T getFirst() {
return getNode(0).value;
}
// 獲得最初一個節點的值
public T getLast() {
return getNode(mCount-1).value;
}
// 將節點拔出到第index地位之前
public void insert(int index, T t) {
if (index==0) {
DNode<T> node = new DNode<T>(t, mHead, mHead.next);
mHead.next.prev = node;
mHead.next = node;
mCount++;
return ;
}
DNode<T> inode = getNode(index);
DNode<T> tnode = new DNode<T>(t, inode.prev, inode);
inode.prev.next = tnode;
inode.next = tnode;
mCount++;
return ;
}
// 將節點拔出第一個節點處。
public void insertFirst(T t) {
insert(0, t);
}
// 將節點追加到鏈表的末尾
public void appendLast(T t) {
DNode<T> node = new DNode<T>(t, mHead.prev, mHead);
mHead.prev.next = node;
mHead.prev = node;
mCount++;
}
// 刪除index地位的節點
public void del(int index) {
DNode<T> inode = getNode(index);
inode.prev.next = inode.next;
inode.next.prev = inode.prev;
inode = null;
mCount--;
}
// 刪除第一個節點
public void deleteFirst() {
del(0);
}
// 刪除最初一個節點
public void deleteLast() {
del(mCount-1);
}
}

測試法式(DlinkTest.java)


/**
* Java 完成的雙向鏈表。
* 注:java自帶的聚集包中有完成雙向鏈表,途徑是:java.util.LinkedList
*
* @author skywang
* @date 2013/11/07
*/
public class DlinkTest {
// 雙向鏈表操作int數據
private static void int_test() {
int[] iarr = {10, 20, 30, 40};
System.out.println("\n----int_test----");
// 創立雙向鏈表
DoubleLink<Integer> dlink = new DoubleLink<Integer>();
dlink.insert(0, 20); // 將 20 拔出到第一個地位
dlink.appendLast(10); // 將 10 追加到鏈表末尾
dlink.insertFirst(30); // 將 30 拔出到第一個地位
// 雙向鏈表能否為空
System.out.printf("isEmpty()=%b\n", dlink.isEmpty());
// 雙向鏈表的年夜小
System.out.printf("size()=%d\n", dlink.size());
// 打印出全體的節點
for (int i=0; i<dlink.size(); i++)
System.out.println("dlink("+i+")="+ dlink.get(i));
}
private static void string_test() {
String[] sarr = {"ten", "twenty", "thirty", "forty"};
System.out.println("\n----string_test----");
// 創立雙向鏈表
DoubleLink<String> dlink = new DoubleLink<String>();
dlink.insert(0, sarr[1]); // 將 sarr中第2個元素 拔出到第一個地位
dlink.appendLast(sarr[0]); // 將 sarr中第1個元素 追加到鏈表末尾
dlink.insertFirst(sarr[2]); // 將 sarr中第3個元素 拔出到第一個地位
// 雙向鏈表能否為空
System.out.printf("isEmpty()=%b\n", dlink.isEmpty());
// 雙向鏈表的年夜小
System.out.printf("size()=%d\n", dlink.size());
// 打印出全體的節點
for (int i=0; i<dlink.size(); i++)
System.out.println("dlink("+i+")="+ dlink.get(i));
}
// 外部類
private static class Student {
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "["+id+", "+name+"]";
}
}
private static Student[] students = new Student[]{
new Student(10, "sky"),
new Student(20, "jody"),
new Student(30, "vic"),
new Student(40, "dan"),
};
private static void object_test() {
System.out.println("\n----object_test----");
// 創立雙向鏈表
DoubleLink<Student> dlink = new DoubleLink<Student>();
dlink.insert(0, students[1]); // 將 students中第2個元素 拔出到第一個地位
dlink.appendLast(students[0]); // 將 students中第1個元素 追加到鏈表末尾
dlink.insertFirst(students[2]); // 將 students中第3個元素 拔出到第一個地位
// 雙向鏈表能否為空
System.out.printf("isEmpty()=%b\n", dlink.isEmpty());
// 雙向鏈表的年夜小
System.out.printf("size()=%d\n", dlink.size());
// 打印出全體的節點
for (int i=0; i<dlink.size(); i++) {
System.out.println("dlink("+i+")="+ dlink.get(i));
}
}

public static void main(String[] args) {
int_test(); // 演示向雙向鏈表操作“int數據”。
string_test(); // 演示向雙向鏈表操作“字符串數據”。
object_test(); // 演示向雙向鏈表操作“對象”。
}
}

運轉成果

----int_test----
isEmpty()=false
size()=3
dlink(0)=30
dlink(1)=20
dlink(2)=10
----string_test----
isEmpty()=false
size()=3
dlink(0)=thirty
dlink(1)=twenty
dlink(2)=ten
----object_test----
isEmpty()=false
size()=3
dlink(0)=[30, vic]
dlink(1)=[20, jody]
dlink(2)=[10, sky]

以上就是本文的全體內容,願望年夜家可以或許懂得,對年夜家有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved