重學資料結構 單鏈表

2021-10-02 15:21:38 字數 3193 閱讀 4939

我們來學習一些單項鍊表的增刪改查。

對於鍊錶可謂是又愛又恨,愛是因為它是真的好用,恨是因為晦澀難懂,來來回回學了幾遍才搞懂。

鍊錶中由兩部分構成:資料 位址指標。頭節點一般都是不存放資料,只是當做單項鍊表的開始索引,方便進行相關操作(頭節點不一定都存在),位址指標存放著下乙個節點的記憶體位址,最後乙個節點的寫乙個指標位址為空。資料部分按需定義即可,這裡資料部分有編號(no)和姓名(name)組成。

/**

* 英雄節點類

* @author laona

*/class heronode

// 重寫 tostring 方法是為了方便遍歷鍊錶

@override

public string tostring() ';

}}

/**

* 單鏈錶類

* @author huaian

*/class singlelinked

新增新的節點到鍊錶,最重要的是找到鍊錶的末尾節點(即鍊錶的最後乙個指向空的節點),這就需要遍歷鍊錶。

遍歷鍊錶需要乙個臨時變數來獲取鍊錶當前不為空的節點 temp,直到最後乙個為空的節點。

// 獲取下乙個節點

temp = temp.next

temp.next = newnode;
/**

* 新增新的節點到單鏈表

* @param newnode 新的節點

*/public void addnode(heronode newnode)

temp = temp.next;

}temp.next = newnode;

}

以上新增功能就完成了,那麼能否讓鍊錶中的資料按照 no 的順序來排列呢?肯定是可以的。

按照公升序排序其實也不難,實現**和鍊錶尾部新增節點的**差不多。需要弄明白的乙個核心是:鍊錶只能通過前乙個節點的 next 去獲取下乙個節點,那麼就需要傳入的 no 和前乙個節點的 next.no 比較。

temp.next.no >= newnode.no
/**

* 按編號公升序新增節點

* @param newnode 新的節點

*/public void addnodebyorder(heronode newnode)

if (temp.next.no >= newnode.no)

newnode.next = temp.next;

temp.next = newnode;

break;

} else

}temp.next = newnode;

}

修改節點資訊就是比較當前節點的下乙個節點資訊和需要修改的節點資訊是否相同,如果相容那麼就直接修改,不相同就繼續比較下乙個節點。

/**

* 根據節點編號修改資訊

* @param no 節點編號

* @param newname 節點資訊

*/public void modifybyno(int no, string newname)

if (temp.next.no == no)

temp = temp.next;

}}

有了前面的鋪墊,刪除節點就很簡單了。刪除節點需要明確是刪除哪乙個節點,這裡就通過 no 刪除節點,這裡也需要通過比較當前節點的下乙個節點資訊和待刪除的節點資訊是否相同,相同則刪除。

// 通過把當前的節點的 next 指向當前節點的 next.next

temp.next = temp.next.next;

/**

* 通過 no 刪除節點

* @param no 節點編號

*/public void dropnodebyino(int no)

if (temp.next.no == no)

temp = temp.next;

}}

方便檢視鍊錶的內容,編寫乙個函式遍歷鍊錶,**如下:

/**

* 遍歷單鏈表的所有節點

*/public void list()

while (true)

system.out.println(temp.next);

temp = temp.next;

}}

為了方便檢視這裡還是把 singlelinked 的**整體**貼一下(節省篇幅,函式只新增頭部,函式體省略)

/**

* 單鏈錶類

* @author huaian

*/class singlelinked

/*** 根據節點編號修改資訊

* @param no 節點編號

* @param newname 節點資訊

*/public void modifybyno(int no, string newname)

/*** 按編號公升序新增節點

* @param newnode 新的節點

*/public void addnodebyorder(heronode newnode)

/*** 新增新的節點到單鏈表

* @param newnode 新的節點

*/public void addnode(heronode newnode)

/*** 遍歷單鏈表的所有節點

*/public void list()

}/**

* 英雄節點類

* @author huaian

*/class heronode

@override

public string tostring() ';

}}

在查詢、比較的時候,需要明白和上個節點比較,還是當前節點比較?需要操作的是當前節點還是下乙個節點?等等。

人若無名,專心練劍!

重學資料結構(四) 實現單鏈表的反轉

思路 1.因為單鏈表沒有指向前乙個節點的指標域,所以這裡需要建立乙個指向前乙個節點的指標pre,用於儲存每乙個節點的前乙個節點。2.需要定義乙個儲存當前節點的指標cur,以及下乙個節點的next。3.先建立cur 當前節點 pre 前乙個節點 指標後,遍歷單鏈表,將當前節點的指標域指向前乙個節點,之...

資料結構單鏈表

初學資料結構,貼段自己編寫的單鏈表程式,希望自己能夠一直以強大的學習熱情持續下去!自勉!2012年3月30日 於大連 include using namespace std typedef struct node linklist,node linklist makelist int n void ...

資料結構 單鏈表

今天浪費了好多時間,也許是心裡想著明天的考試吧 可自己也知道這次的考試,自己畢竟過不了了,只好等到今年11月份,想想那時自己已經大三了 還有那麼多時間嗎!很懊惱今天不知怎麼回事,感嘆環境真的可以影響乙個人,真的可以 把今天的學習筆記寫下來,沒有進行好好的整理,這回單鏈表的功能較多,操作比較散,最後乙...