C++手撕單鏈表及逆序打印

在學習數據結構的過程中,鏈表是一個非常重要的基礎數據結構。今天,我們將通過C++手動實現一個單鏈表,并添加一個逆序打印的功能,幫助大家更好地理解鏈表的實現和操作。

一、鏈表簡介

鏈表是一種線性數據結構,其中每個元素(稱為節點)包含數據部分和指向下一個節點的指針。與數組不同,鏈表的內存空間是動態分配的,因此可以靈活地插入和刪除節點,而不需要移動其他元素。

單鏈表是最簡單的鏈表形式,每個節點只有一個指向下一個節點的指針。

二、單鏈表的實現

1. 定義鏈表節點

我們首先定義鏈表節點的結構。每個節點包含一個整數值和一個指向下一個節點的指針。

#include <iostream>
using namespace std;// 定義鏈表節點結構
struct ListNode {int val;          // 節點存儲的數據ListNode* next;   // 指向下一個節點的指針// 構造函數ListNode(int x) : val(x), next(nullptr) {}
};

2. 定義鏈表類

接下來,我們定義一個鏈表類,包含鏈表的基本操作,如插入、刪除和遍歷。

class LinkedList {
private:ListNode* head; // 鏈表的頭指針public:// 構造函數LinkedList() : head(nullptr) {}// 析構函數,釋放鏈表內存~LinkedList() {ListNode* current = head;while (current != nullptr) {ListNode* temp = current;current = current->next;delete temp;}}// 插入節點到鏈表頭部void insertAtHead(int value) {ListNode* newNode = new ListNode(value);newNode->next = head;head = newNode;}// 插入節點到鏈表尾部void insertAtTail(int value) {ListNode* newNode = new ListNode(value);if (head == nullptr) {head = newNode;return;}ListNode* current = head;while (current->next != nullptr) {current = current->next;}current->next = newNode;}// 刪除節點void deleteNode(int value) {if (head == nullptr) return; // 鏈表為空if (head->val == value) {ListNode* temp = head;head = head->next;delete temp;return;}ListNode* current = head;while (current->next != nullptr && current->next->val != value) {current = current->next;}if (current->next != nullptr) {ListNode* temp = current->next;current->next = current->next->next;delete temp;}}// 打印鏈表void printList() {ListNode* current = head;while (current != nullptr) {cout << current->val << " -> ";current = current->next;}cout << "nullptr" << endl;}// 逆序打印鏈表void reversePrint(ListNode* node) {if (node == nullptr) return;reversePrint(node->next);cout << node->val << " ";}// 調用逆序打印void reversePrint() {reversePrint(head);cout << endl;}
};

3. 測試鏈表

我們編寫一個簡單的測試程序來驗證鏈表的功能,包括插入、刪除、正序打印和逆序打印。

int main() {LinkedList list;// 插入節點list.insertAtHead(3);list.insertAtHead(2);list.insertAtHead(1);list.insertAtTail(4);list.insertAtTail(5);// 打印鏈表cout << "鏈表內容: ";list.printList();// 逆序打印鏈表cout << "逆序打印鏈表: ";list.reversePrint();// 刪除節點list.deleteNode(3);cout << "刪除節點 3 后的鏈表: ";list.printList();// 刪除頭節點list.deleteNode(1);cout << "刪除頭節點后的鏈表: ";list.printList();return 0;
}

4. 輸出示例

運行上述代碼后,輸出如下:

鏈表內容: 1 -> 2 -> 3 -> 4 -> 5 -> nullptr
逆序打印鏈表: 5 4 3 2 1
刪除節點 3 后的鏈表: 1 -> 2 -> 4 -> 5 -> nullptr
刪除頭節點后的鏈表: 2 -> 4 -> 5 -> nullptr

三、逆序打印的實現

逆序打印鏈表的關鍵在于遞歸。我們定義了一個遞歸函數 reversePrint,它先遞歸到鏈表的尾部,然后在回溯過程中打印每個節點的值。這種方法利用了遞歸的調用棧,自然地實現了逆序打印。

逆序打印函數

void reversePrint(ListNode* node) {if (node == nullptr) return;reversePrint(node->next);cout << node->val << " ";
}

調用逆序打印

void reversePrint() {reversePrint(head);cout << endl;
}

四、總結

通過手動實現單鏈表,我們不僅加深了對鏈表數據結構的理解,還學會了如何操作鏈表節點,包括插入、刪除和遍歷。此外,逆序打印功能的實現進一步展示了遞歸在鏈表操作中的強大作用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76319.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

netty中的ChannelPipeline詳解

Netty中的ChannelPipeline是事件處理鏈的核心組件,負責將多個ChannelHandler組織成有序的責任鏈,實現網絡事件(如數據讀寫、連接狀態變化)的動態編排和傳播。以下從核心機制、執行邏輯到應用場景進行詳細解析: 1. 核心結構與組成 雙向鏈表結構 組成單元:ChannelPipeline…

智能物聯網網關策略部署

實訓背景 某智慧工廠需部署物聯網網關&#xff0c;實現以下工業級安全管控需求&#xff1a; 設備準入控制&#xff1a;僅允許注冊MAC地址的傳感器接入&#xff08;白名單&#xff1a;AA:BB:CC:DD:EE:FF&#xff09;。協議合規性&#xff1a;禁止非Modbus TCP&#xff08;端口…

前端-vue2核心

官網網址Vue2 安裝 — Vue.js 搭建環境 第一種方式&#xff08;剛開是接觸Vue&#xff09; 我們看官網&#xff0c;可以直接在script引入vue版本。這里有兩個版本&#xff0c;開發版和生產版本。我們兩個都下載。 然后創建一個項目&#xff0c;將下載的生產版本和開發版本粘…

【BUG】遠程連接阿里云服務器上的redis報錯

出現 Redis Client On Error: Error: connect ECONNREFUSED 47.100.XXX.XX:6379 錯誤&#xff0c;表明 Redis 客戶端無法連接到指定的 Redis 服務器&#xff0c;可按以下步驟排查解決&#xff1a; 1. 檢查 Redis 服務器是否運行 操作&#xff1a;在 Redis 服務器所在終端執行…

mongodb--用戶管理

文章目錄 MongoDB 用戶管理1. 連接到 MongoDB2. 用戶創建2.1 創建管理員用戶2.2 創建特定數據庫用戶2.3 常用內置角色 3. 用戶管理操作3.1 查看所有用戶3.2 查看特定用戶信息3.3 更新用戶密碼3.4 添加用戶角色3.5 移除用戶角色3.6 刪除用戶 4. 權限修改4.1 創建自定義角色4.2 將…

DeepSeek與搜索引擎:AI生成內容如何突破“語義天花板”

一、搜索引擎的“內容饑餓癥”與AI的“產能悖論” 2024年&#xff0c;全球每天新增470萬篇網絡文章&#xff0c;但搜索引擎的索引拒絕率高達68%。這一矛盾的根源在于&#xff1a;算法對“高質量原創”的定義已從“形式獨特性”轉向“認知增值性”。傳統AI生成內容&#xff08;…

YOLO目標檢測應用——基于 YOLOv8目標檢測和 SAM 零樣本分割實現指定目標分割

概述 在當前的計算機視覺領域&#xff0c;目標分割技術正變得越來越重要。市面上有許多分割模型&#xff0c;它們的工作原理大致相似&#xff0c;通常包括收集數據、配置模型以及訓練分割模型等步驟。最終目標是實現精確的目標分割。而隨著 SAM&#xff08;Segment Anything M…

在Flutter中使用BottomNavigationBar和IndexedStack可以實現一個功能完整的底部導航欄

在Flutter中&#xff0c;使用BottomNavigationBar和IndexedStack可以實現一個功能完整的底部導航欄。BottomNavigationBar用于顯示底部的導航按鈕&#xff0c;而IndexedStack則用于管理頁面的切換&#xff0c;確保每個頁面的狀態得以保留&#xff08;即頁面不會因為切換而重新構…

【10】數據結構的矩陣與廣義表篇章

目錄標題 二維以上矩陣矩陣存儲方式行序優先存儲列序優先存儲 特殊矩陣對稱矩陣稀疏矩陣三元組方式存儲稀疏矩陣的實現三元組初始化稀疏矩陣的初始化稀疏矩陣的創建展示當前稀疏矩陣稀疏矩陣的轉置 三元組稀疏矩陣的調試與總代碼十字鏈表方式存儲稀疏矩陣的實現十字鏈表數據標簽…

微服務篇——SpringCloud

服務注冊 Spring Cloud5大組件有哪些&#xff1f; 服務注冊和發現是什么意思&#xff1f;Spring Cloud如何實現服務注冊發現&#xff1f; nacos與eureka的區別 負載均衡 如何實現負載均衡&#xff1f; Ribbon負載均衡的策略有哪些&#xff1f; 如何自定義負載均衡的策略&…

【小沐雜貨鋪】基于Three.JS繪制三維數字地球Earth(GIS 、WebGL、vue、react,提供全部源代碼)

&#x1f37a;三維數字地球系列相關文章如下&#x1f37a;&#xff1a;1【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

Cursor 在前端需求開發工作流中的應用|得物技術

一、引言 很高興與大家分享現階段 Cursor 在我的工作中的使用體驗。首先是預期管理&#xff0c;本篇文章不會分享 x 個你可能不知道的小技巧&#xff0c;也不會讓你擁有無需自行編碼的能力&#xff0c;同時不涉及 Cursor 工程化方面內容。僅僅是圍繞個人開發流程中的已有問題&…

PyQt學習記錄

PyQt學習記錄 要在界面上 創建一個控件&#xff0c;就需要在程序代碼中 創建 這個 控件對應類 地一個 實例對象。 在Qt系統中&#xff0c;控件&#xff08;widget&#xff09;是 層層嵌套 的&#xff0c;除了最頂層的控件&#xff0c;其他的控件都有父控件。 幾個函數 函數mo…

react: styled-components實現原理 標簽模版

styled-components是針對react中一個前端廣泛使用的css-in-js樣式庫B站 利用標簽模版 利用ES6中的 標簽模版文檔標簽模板其實不是模板&#xff0c;而是函數調用的一種特殊形式。“標簽”指的就是函數&#xff0c;緊跟在后面的模板字符串就是它的參數。 let a 5; let b 10;…

網絡安全應急響應之文件痕跡排查:從犯罪現場到數字狩獵的進化論

凌晨3點&#xff0c;某金融企業的服務器突然告警&#xff0c;核心數據庫出現未知進程訪問。安全團隊緊急介入時&#xff0c;攻擊者已抹去日志痕跡。在這場與黑客的時間賽跑中&#xff0c;文件痕跡排查成為破局關鍵。本文將帶您深入數字取證的"案發現場"&#xff0c;揭…

多模態大語言模型arxiv論文略讀(七)

MLLM-DataEngine: An Iterative Refinement Approach for MLLM ?? 論文標題&#xff1a;MLLM-DataEngine: An Iterative Refinement Approach for MLLM ?? 論文作者&#xff1a;Zhiyuan Zhao, Linke Ouyang, Bin Wang, Siyuan Huang, Pan Zhang, Xiaoyi Dong, Jiaqi Wang,…

idea插件:AICommit,智能生成Git提交信息

AICommit&#xff1a;智能生成Git提交信息的IDEA插件指南 一、AICommit插件介紹 AICommit是一款專為開發者設計的IntelliJ IDEA插件&#xff0c;它利用人工智能技術自動生成清晰、規范的Git提交信息(Commit Message)。該插件能夠分析你的代碼變更&#xff0c;理解修改的上下文…

js 拷貝-包含處理循環引用問題

在 JavaScript 中&#xff0c;拷貝對象和數組時需要特別注意&#xff0c;因為對象和數組是引用類型&#xff0c;直接賦值只會復制引用&#xff0c;而不是實際的數據。以下是幾種常見的拷貝方法及其應用場景&#xff1a; 1. 淺拷貝&#xff08;Shallow Copy&#xff09; 淺拷貝…

oracle將varchar2 轉為clob類型存儲。 oracle不支持直接使用sql,將 varchar2 到clob的類型轉換,需要下面操作

將一個現有表中的 VARCHAR2 列數據遷移到一個 CLOB 列的過程。以下是對每一步操作的說明&#xff1a; 1. 添加一個新的 CLOB 類型列 首先&#xff0c;向表中添加一個新的 CLOB 類型的列。這個列將用來存儲原本的 VARCHAR2 數據。 ALTER TABLE your_table ADD (new_column CL…

Dynamics 365 Business Central Recurring Sales Lines 經常購買銷售行 來作 訂閱

#D365 BC ERP# #Navision# 前面有節文章專門介紹了BC 2024 Wave 2 支持的更好的Substription & Recurring Billing。 其實在D365 BC ERP中一直有一個比較簡單的訂閱模塊Recrring Sales Lines。本文將介紹一下如何用Recurring Sales Lines來 實施簡易的訂閱Substription。具…