C++?自定義單向鏈表?ListNode詳情
鏈表有兩種:
- 1、帶頭結(jié)點(diǎn),頭結(jié)點(diǎn)存放的是鏈表的長(zhǎng)度,從第二個(gè)節(jié)點(diǎn)開(kāi)始存放數(shù)據(jù)。
- 2、不帶頭結(jié)點(diǎn),沒(méi)有存放鏈表長(zhǎng)度的節(jié)點(diǎn),從頭結(jié)點(diǎn)開(kāi)始就存放數(shù)據(jù)。
小編這里定義的鏈表是第二種。
直接上代碼:
#include <iostream> #include <assert.h> #include <vector> #include <algorithm> using namespace std; struct ListNode { ? ? int val; ? //當(dāng)前節(jié)點(diǎn)的值 ? ? ListNode *next; ? //指向下一個(gè)節(jié)點(diǎn)的指針 ? ? ListNode() : val(0), next(nullptr) {} ? //初始化當(dāng)前結(jié)點(diǎn)值為默認(rèn)值0,指針為空 ? ? ListNode(int x) : val(x), next(nullptr) {} ? ?//初始化當(dāng)前結(jié)點(diǎn)值為x,指針為空 ? ? ListNode(int x, ListNode *next) : val(x), next(next) {} ? ?//初始化當(dāng)前結(jié)點(diǎn)值為x,下一個(gè)績(jī)點(diǎn)為next }; class Solution { public: ? ? //創(chuàng)建長(zhǎng)度為len的單向鏈表 ? ? void createList(ListNode *head,int len){ ? ? ? ? for(int i=1;i<len;i++) ? //len-1個(gè)節(jié)點(diǎn),加上head節(jié)點(diǎn)共len個(gè) ? ? ? ? { ? ? ? ? ? ? ListNode *node=new ListNode; ? //每次都需要實(shí)例化一個(gè)ListNode ? ? ? ? ? ? node->val=i*i; ? ?//為節(jié)點(diǎn)賦值 ? ? ? ? ? ? node->next=nullptr; ? ? ? ? ? ? head->next=node; ? //head指向下一個(gè)節(jié)點(diǎn)(即當(dāng)前節(jié)點(diǎn)) ? ? ? ? ? ? head=node; ? ? //將當(dāng)前節(jié)點(diǎn)設(shè)為head ? ? ? ? } ? ? ? ? cout<<"Create a new ListNode with len of "<<len<<" successfully."<<endl; ? ? } ? ? //打印鏈表(順序) ? ? void printList(ListNode *head){ ? ? ? ? if(head==nullptr) ? ? ? ? ? ? ? ? ? ? cout<<"empty list."<<endl; ? ? ? ? else ? ? ? ? ? ? while(head!=nullptr) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? cout<<head->val<<'\t'; ? ? ? ? ? ? ? ? head=head->next; ? ? ? ? ? ? } ? ? ? ? cout<<endl; ? ? } ? ? //打印鏈表(逆序) ? ? void reversePrintList(ListNode *head){ ? ? ? ? //因?yàn)長(zhǎng)istNode只能根據(jù)next單向索引,無(wú)法逆向回溯,所以只能將節(jié)點(diǎn)數(shù)值存在vector中反向輸出。 ? ? ? ? //目前只想到了這種方法。 ? ? ? ? if(head==nullptr) ? ? ? ? { ? ? ? ? ? ? cout<<"empty list."<<endl; ? ? ? ? ? ? exit(1); ? ? ? ? } ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? vector<int> node; ? ? ? ? ? ? while(head!=nullptr) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? node.push_back(head->val); ? ? ? ? ? ? ? ? head=head->next; ? ? ? ? ? ? } ? ? ? ? ? ? while(!node.empty()) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //先輸出node中的最后一個(gè)元素,再刪除最后一個(gè)元素。而不是先對(duì)node做reverse再正向輸出。 ? ? ? ? ? ? ? ? cout<<node.back()<<'\t'; ? ? ? ? ? ? ? ? node.pop_back(); ? ? ? ? ? ? } ? ? ? ? ? ? cout<<endl; ? ? ? ? } ? ? } ? ? //在鏈表尾節(jié)點(diǎn)添加一個(gè)新節(jié)點(diǎn) ? ? void pushBack(ListNode *head,int val){ ? ? ? ? ListNode *node=new ListNode(val,nullptr); ? //要添加的新節(jié)點(diǎn) ? ? ? ? if(head==nullptr) ? ? ? ? ? ? head=node; ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? while(head->next!=nullptr) ? ?//while循環(huán)結(jié)束后head就是尾結(jié)點(diǎn)了 ? ? ? ? ? ? ? ? head=head->next; ? ? ? ? ? ? head->next=node; ? ? ? ? } ? ? } ? ? //更改鏈表尾節(jié)點(diǎn)數(shù)值 ? ? void changeBackValue(ListNode *head,int val){ ? ? ? ? assert(head!=nullptr); ? ? ? ? while(head->next!=nullptr) ? ?//while循環(huán)結(jié)束后head就是尾結(jié)點(diǎn)了 ? ? ? ? ? ? head=head->next; ? ? ? ? head->val=val; ? ? } ? ? //刪除鏈表尾節(jié)點(diǎn) ? ? void popBack(ListNode *head){ ? ? ? ? assert(head!=nullptr); ? ? ? ? while(head->next->next!=nullptr) ? //while循環(huán)結(jié)束后head是倒數(shù)第二個(gè)節(jié)點(diǎn),其next指向尾節(jié)點(diǎn) ? ? ? ? ? ? head=head->next; ? ? ? ? head->next=nullptr; ? //刪除尾節(jié)點(diǎn) ? ? ? ? //注意不要直接delete尾結(jié)點(diǎn),因?yàn)槲步Y(jié)點(diǎn)的next是nullptr,直接delete nullptr會(huì)輸出很多亂碼。 ? ? } ? ? //刪除鏈表中節(jié)點(diǎn)值等于指定值的節(jié)點(diǎn)(不包括頭節(jié)點(diǎn)) ? ? void deleteNode(ListNode *head, int val) { ? ? ? ? assert(head != nullptr); ? ? ? ? ListNode *node = head; ? ?//copy一份鏈表 ? ? ? ? while (head->next != nullptr) ? ? ? ? { ? ? ? ? ? ? if (head->next->val == val) ? ? ? ? ? ? ? ? node->next=head->next->next; ? ? ? ? ? ? head=head->next; ? ? ? ? ? ? node=node->next; ? ? ? ? } ? ? } ? ? //清空列表 ? ? void clearList(ListNode *head){ ? ? ? ? head->next=nullptr; ? //清楚頭結(jié)點(diǎn)之后的所有節(jié)點(diǎn) ? ? ? ? //清空列表的功能一直不知道怎么實(shí)現(xiàn),頭結(jié)點(diǎn)不知道怎么刪除。 ? ? } }; int main() { ? ? Solution solution; ? ? ListNode *listnode=new ListNode(5,nullptr); ? //初始化鏈表的head節(jié)點(diǎn) ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? solution.createList(listnode,5); ?? ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? ? 1 ? ? ? 4 ? ? ? 9 ? ? ? 16 ? ? solution.pushBack(listnode,30); ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? ? 1 ? ? ? 4 ? ? ? 9 ? ? ? 16 ? ? ?30 ? ? solution.reversePrintList(listnode); ? ?// 30 ? ? ?16 ? ? ?9 ? ? ? 4 ? ? ? 1 ? ? ? 5 ? ? solution.changeBackValue(listnode,88); ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? ? 1 ? ? ? 4 ? ? ? 9 ? ? ? 16 ? ? ?88 ? ? solution.popBack(listnode); ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? ? 1 ? ? ? 4 ? ? ? 9 ? ? ? 16 ? ? solution.pushBack(listnode,101); ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? ? 1 ? ? ? 4 ? ? ? 9 ? ? ? 16 ? ? ?101 ? ? solution.deleteNode(listnode,9); ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? ? 1 ? ? ? 4 ? ? ? 16 ? ? ?101 ? ? solution.clearList(listnode); ? ? solution.printList(listnode); ? ? ? ? ? // 5 ? ? cout<<"END"<<endl; ? ? return 0; }
程序輸出:
5
Create a new ListNode with len of 5 successfully.
5 1 4 9 16
5 1 4 9 16 30
30 16 9 4 1 5
5 1 4 9 16 88
5 1 4 9 16
5 1 4 9 16 101
5 1 4 16 101
5
END
到此這篇關(guān)于C++ 自定義單向鏈表 ListNode詳情的文章就介紹到這了,更多相關(guān)C++ 自定義單向鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vs2022?qt環(huán)境搭建調(diào)試的方法步驟
最近net6和vs2022發(fā)布,本文就詳細(xì)的介紹一下vs2022?qt環(huán)境搭建調(diào)試的方法步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12C語(yǔ)言編寫(xiě)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言編寫(xiě)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語(yǔ)言的方法
Visual Studio Code是一款免費(fèi)開(kāi)源的現(xiàn)代化輕量級(jí)代碼編輯器,支持語(yǔ)法高亮、智能代碼補(bǔ)全、自定義熱鍵、括號(hào)匹配、代碼片段、代碼對(duì)比 Diff、GIT 等特性,這篇文章主要介紹了VSCode (Visual Studio Code) V1.43.0下載并設(shè)置成中文語(yǔ)言,需要的朋友可以參考下2020-03-03C/C++?Qt?StatusBar底部狀態(tài)欄應(yīng)用教程
Qt窗體中默認(rèn)會(huì)附加一個(gè)QstatusBar組件,狀態(tài)欄組件位于主窗體的最下方,其作用是提供一個(gè)工具提示功能。本文主要介紹了StatusBar底部狀態(tài)欄的應(yīng)用教程,需要的同學(xué)可以學(xué)習(xí)一下2021-12-12如何實(shí)現(xiàn)在C++中調(diào)用C函數(shù)
這篇文章主要介紹了如何實(shí)現(xiàn)在C++中調(diào)用C函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C語(yǔ)言sizeof與字符串處理與動(dòng)態(tài)內(nèi)存分配及main函數(shù)參數(shù)詳解
這篇文章主要介紹了C語(yǔ)言字符串處理函數(shù)、sizeof、動(dòng)態(tài)內(nèi)存分配函數(shù)、main函數(shù)參數(shù)問(wèn)題,static在修飾變量的時(shí)候,如果是修飾全局變量,則跟全局變量功能一樣,通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07