亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

簡單介紹線性表以及如何實現雙鏈表

2019-11-26 15:03:49
字體:
來源:轉載
供稿:網友

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

一、數組
數組有上界和下界,數組的元素在上下界內是連續的。

存儲10,20,30,40,50的數組的示意圖如下:

數組的特點:數據是連續的;隨機訪問速度快。
數組中稍微復雜一點的是多維數組和動態數組。對于C語言而言,多維數組本質上也是通過一維數組實現的。至于動態數組,是指數組的容量能動態增長的數組;對于C語言而言,若要提供動態數組,需要手動實現;而對于C++而言,STL提供了Vector;對于Java而言,Collection集合中提供了ArrayList和Vector。

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

單鏈表的示意圖如下:

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

單鏈表刪除節點

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

單鏈表添加節點

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

單鏈表的特點是:節點的鏈接方向是單向的;相對于數組來說,單鏈表的的隨機訪問速度較慢,但是單鏈表刪除/添加數據的效率很高。

三、雙向鏈表
雙向鏈表(雙鏈表)是鏈表的一種。和單鏈表一樣,雙鏈表也是由節點組成,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。一般我們都構造雙向循環鏈表。

雙鏈表的示意圖如下:

表頭為空,表頭的后繼節點為"節點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// 新建“雙向鏈表”。成功,返回表頭;否則,返回NULLextern int create_dlink();// 撤銷“雙向鏈表”。成功,返回0;否則,返回-1extern 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;否則,返回-1extern int dlink_delete(int index);// 刪除第一個節點。成功,返回0;否則,返回-1extern int dlink_delete_first();// 刪除組后一個節點。成功,返回0;否則,返回-1extern 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;// 節點的值為pvalpnode->p = pval;return pnode;}// 新建“雙向鏈表”。成功,返回0;否則,返回-1。int create_dlink(){// 創建表頭phead = create_node(NULL);if (!phead)return -1;// 設置“節點個數”為0count = 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;// 節點個數+1count++;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()=0dlink_size()=3dlink_get(0)=30dlink_get(1)=20dlink_get(2)=10----string_test----dlink_is_empty()=0dlink_size()=3dlink_get(0)=thirtydlink_get(1)=twentydlink_get(2)=ten----object_test----dlink_is_empty()=0dlink_size()=3dlink_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()=0size()=3pdlink(0)=30pdlink(1)=20pdlink(2)=10----string_test----is_empty()=0size()=3pdlink(0)=thirtypdlink(1)=twentypdlink(2)=ten----object_test----is_empty()=0size()=3pdlink(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;// 初始化“節點個數”為0mCount = 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;}@Overridepublic 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()=falsesize()=3dlink(0)=30dlink(1)=20dlink(2)=10----string_test----isEmpty()=falsesize()=3dlink(0)=thirtydlink(1)=twentydlink(2)=ten----object_test----isEmpty()=falsesize()=3dlink(0)=[30, vic]dlink(1)=[20, jody]dlink(2)=[10, sky]

以上就是本文的全部內容,希望大家能夠理解,對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产激情| 色噜噜久久综合伊人一本| 综合久久五月天| 91精品国产91久久久久久| 国产精品美女久久久久av超清| 日本高清+成人网在线观看| 一区二区国产精品视频| 欧美激情图片区| 国产精品高潮呻吟久久av无限| 国产精品video| 欧美限制级电影在线观看| 国产欧美日韩免费| 成人网址在线观看| 久久九九免费视频| 日韩在线精品视频| 欧美日韩亚洲一区二| 亚洲第一级黄色片| 高清欧美一区二区三区| 91久久精品国产91性色| 91在线免费视频| 日韩免费观看在线观看| 激情av一区二区| 国产欧美日韩综合精品| 欧美成人亚洲成人日韩成人| 国产精品视频中文字幕91| 亚洲男人天堂2024| 国产成人拍精品视频午夜网站| 欧洲成人在线观看| 欧美成人免费全部观看天天性色| 91豆花精品一区| 久久精品91久久香蕉加勒比| 日本成人在线视频网址| 国产精品麻豆va在线播放| 国自产精品手机在线观看视频| 欧美精品第一页在线播放| 国产欧美日韩专区发布| 亚洲国产精品va在线| 亚洲美女动态图120秒| 自拍偷拍亚洲精品| 亚洲性av网站| 另类专区欧美制服同性| 亚洲自拍高清视频网站| 久久精品国产v日韩v亚洲| 日韩中文视频免费在线观看| 国产有码一区二区| 亚洲网站在线看| 日韩av大片免费看| 成人乱人伦精品视频在线观看| 亚洲mm色国产网站| 欧美激情一级二级| 久久久久国产精品www| 午夜剧场成人观在线视频免费观看| 亚洲国产精品推荐| 亚洲一区二区三区成人在线视频精品| 国产999精品视频| 国产亚洲日本欧美韩国| 一区二区三区视频免费在线观看| 91探花福利精品国产自产在线| 欧美成人免费在线观看| 欧美怡红院视频一区二区三区| 成人国产精品免费视频| 亚洲成色777777女色窝| 久久亚洲国产精品成人av秋霞| 国产日韩在线亚洲字幕中文| 韩国日本不卡在线| 久久av中文字幕| 精品久久久久久亚洲国产300| 性色av一区二区咪爱| 亚洲片在线资源| 亚洲第一色中文字幕| 一区二区成人av| 91爱视频在线| 国产精品久久久久久久一区探花| 日韩va亚洲va欧洲va国产| 最新国产精品亚洲| 茄子视频成人在线| 亚洲欧美日韩精品| 亚洲日本欧美日韩高观看| 日韩亚洲在线观看| 亚洲国产日韩欧美综合久久| 亚洲二区中文字幕| 亚洲美女视频网站| 亚洲精品国产综合区久久久久久久| 日韩视频在线免费| 国产精品白嫩美女在线观看| 亚洲第一免费网站| 亚洲精品自拍第一页| 韩国三级日本三级少妇99| 国产精品欧美一区二区| 91国产美女在线观看| 3344国产精品免费看| 日韩欧美中文在线| 亚洲精品久久久一区二区三区| 国产97色在线|日韩| 日韩有码在线视频| 欧美激情三级免费| 国产精品99一区| 国产成人jvid在线播放| 国产精品video| 久久青草精品视频免费观看| 欧美裸体xxxx| 亚洲男人天堂手机在线| 在线视频一区二区| 黑人精品xxx一区一二区| 亚洲欧美日本精品| 欧美高清激情视频| 在线电影中文日韩| 久热在线中文字幕色999舞| 亚洲成人精品久久久| 亚洲女人初尝黑人巨大| 欧美日本黄视频| 日韩在线观看你懂的| 亚洲视频在线看| 成人性生交大片免费看小说| 亚洲国产成人在线播放| 久久精品国产久精国产思思| 久久久精品视频在线观看| 国产欧美一区二区三区在线| 亚洲福利视频二区| 奇米影视亚洲狠狠色| 亚洲精品网址在线观看| 一级做a爰片久久毛片美女图片| 欧美日韩国产中文精品字幕自在自线| 日韩精品视频在线观看免费| 国产视频综合在线| 亚洲欧洲在线视频| 日韩影视在线观看| www.日韩视频| 国产成人一区二区在线| 国模精品系列视频| 成人免费淫片aa视频免费| 日本欧美国产在线| 精品久久久久国产| 国产精品十八以下禁看| 成人深夜直播免费观看| 亚洲高清久久久久久| 亚洲区中文字幕| 午夜精品久久久久久99热软件| 日韩在线中文视频| 懂色av中文一区二区三区天美| 国产乱肥老妇国产一区二| 国产精品久久久久久av福利软件| 97视频在线观看免费高清完整版在线观看| 国产黑人绿帽在线第一区| 亚洲欧美日本精品| 中文字幕av一区二区三区谷原希美| 国产一区在线播放| 777午夜精品福利在线观看| 国产欧美一区二区三区久久| 一本色道久久综合亚洲精品小说| 久久精品电影一区二区| 国产精品视频导航| 久久精品国产久精国产一老狼| 日韩av免费网站| 午夜精品久久久久久久白皮肤| 久久99精品久久久久久琪琪| 亚洲免费福利视频| 亚洲国产一区二区三区在线观看| 欧美一区视频在线| 欧美精品久久久久久久久久| 97香蕉久久夜色精品国产| 欧美高清理论片| 另类专区欧美制服同性| 亚洲一区二区精品|