鏈表操作:分區與回文判斷

目錄

鏈表分區(Partition)

功能概述

代碼實現

要點與難點

注意事項

鏈表回文判斷(PalindromeList)

功能概述

代碼實現

要點與難點

注意事項

總結


在鏈表相關的算法問題中,理解鏈表的基本結構和操作至關重要。今天我們深入探討兩個經典的鏈表問題:鏈表分區和鏈表回文判斷,通過詳細分析代碼實現,理解其中的要點、難點和注意事項。

作者主頁:共享家9527-CSDN博客

鏈表分區(Partition)

功能概述

鏈表分區的目標是將給定鏈表按照某個值?x?進行劃分,使得所有小于?x?的節點排在大于或等于?x?的節點之前。

代碼實現


?

cppclass Partition {public:ListNode* partition(ListNode* pHead, int x) {// 定義用于存儲大于等于x節點鏈表的頭指針和尾指針,以及小于x節點鏈表的頭指針和尾指針,還有遍歷原鏈表的指針struct ListNode* greatHead, *greattail, *lessHead, *lesstail, *cur;?// 為大于等于x節點鏈表的頭指針和尾指針分配內存,并初始化為同一節點greatHead = greattail = (struct ListNode*)malloc(sizeof(struct ListNode));?// 為小于x節點鏈表的頭指針和尾指針分配內存,并初始化為同一節點lessHead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));?// 將遍歷指針指向原鏈表頭節點cur = pHead;??// 遍歷原鏈表進行尾插while(cur){if(cur->val < x){// 將當前小于x的節點接到less鏈表的尾部lesstail->next = cur;??// 更新less鏈表的尾指針為當前節點lesstail = cur;? ?// 原鏈表中cur指針繼續指向下一個節點cur = cur->next;??}else{// 將當前大于等于x的節點接到great鏈表的尾部greattail->next = cur;?// 更新great鏈表的尾指針為當前節點greattail = cur;??// 原鏈表中cur指針繼續指向下一個節點cur = cur->next;??}}// 將less鏈表和great鏈表連接起來lesstail->next = greatHead->next;??// 將great鏈表的最后一個節點的next指針置為NULL,避免原鏈表的鏈接干擾greattail->next = NULL;? ? ? ? ? ?// 返回less鏈表的第一個有效節點(去掉虛擬頭節點)return lessHead->next;?}};

要點與難點

1.?虛擬頭節點的使用:為簡化鏈表操作,創建了兩個虛擬頭節點?lessHead?和?greatHead?,分別用于存儲小于?x?和大于等于?x?的節點。這避免了對鏈表頭節點的特殊處理,讓代碼更簡潔統一。

2.?尾插法:通過?lesstail?和?greattail?指針,采用尾插法將原鏈表中的節點分別插入到兩個新鏈表中,保持節點的相對順序。

3.?鏈表連接:遍歷結束后,將?lesstail?的?next?指針指向?greatHead->next?,實現兩個鏈表的連接。

4.?最后節點處理:必須將?greattail?的?next?指針設為?NULL?,否則可能會形成環或導致錯誤的鏈表結構。

注意事項

- 內存分配:使用?malloc?分配內存時,記得在不再使用時釋放內存,避免內存泄漏。

- 邊界條件:考慮鏈表為空或只有一個節點的情況,確保代碼的魯棒性。

鏈表回文判斷(PalindromeList)

功能概述

判斷給定的鏈表是否為回文鏈表,即正向和反向讀取鏈表節點的值是相同的。

代碼實現


?

cppclass PalindromeList {public:bool chkPalindrome(ListNode* A) {// 定義慢指針,初始指向鏈表頭節點struct ListNode* slow = A;?// 定義快指針,初始指向鏈表頭節點struct ListNode* fast = A;?// 利用快慢指針找鏈表中間節點,快指針每次走兩步,慢指針每次走一步while (fast->next) {?slow = slow->next;fast = fast->next;// 如果快指針還有下一個節點,再走一步if (fast->next) {?fast = fast->next;}}// 用于存儲反轉后半部分鏈表的新頭指針struct ListNode* change = NULL;?// 從中間節點開始處理后半部分鏈表struct ListNode* head = slow;?// 反轉鏈表的后半部分while (head) {// 保存當前節點的下一個節點struct ListNode* next = head->next;?// 將當前節點指向前一個節點,實現反轉head->next = change;?// 更新新的頭指針為當前節點change = head;?// 繼續處理下一個節點head = next;?}// 比較鏈表的前半部分和反轉后的后半部分while (slow) {// 如果對應節點值不相等,返回falseif (A->val != change->val) {?return false;}// 前半部分鏈表指針后移A = A->next;?// 反轉后的后半部分鏈表指針后移change = change->next;?}// 所有對應節點值都相等,返回truereturn true;?}};

要點與難點

1.?快慢指針:利用快慢指針找到鏈表的中間節點。快指針每次移動兩步,慢指針每次移動一步,當快指針到達鏈表末尾時,慢指針正好指向中間節點。這是找到鏈表中間位置的高效方法。

2.?鏈表反轉:將鏈表的后半部分進行反轉,通過改變指針方向實現。在反轉過程中,需要小心處理指針的指向,確保鏈表結構不被破壞。

3.?比較判斷:從鏈表的兩端開始比較節點的值,若所有值都相同,則鏈表為回文鏈表。

注意事項

- 指針操作:在鏈表反轉過程中,要注意保存當前節點的下一個節點,以免丟失鏈表結構。

- 邊界條件:考慮鏈表長度為奇數和偶數的情況,確保代碼在各種情況下都能正確判斷。比如鏈表長度為奇數時,中間節點單獨處理,不參與比較;鏈表長度為偶數時,中間兩個節點分別屬于前后兩部分參與比較 。

總結

鏈表操作需要對指針有深入的理解和熟練的運用。無論是鏈表分區還是回文判斷,關鍵在于合理利用指針來遍歷、修改鏈表結構。在實現過程中,要注意邊界條件的處理、內存管理以及代碼的可讀性和可維護性。通過不斷練習和總結,我們可以更好地掌握鏈表相關的算法問題,提高編程能力。

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

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

相關文章

如何在 Node.js 中使用 .env 文件管理環境變量 ?

Node.js 應用程序通常依賴于環境變量來管理敏感信息或配置設置。.env 文件已經成為一種流行的本地管理這些變量的方法&#xff0c;而無需在代碼存儲庫中公開它們。本文將探討 .env 文件為什么重要&#xff0c;以及如何在 Node.js 應用程序中有效的使用它。 為什么使用 .env 文…

【Git學習筆記】Git結構原理及其分支管理模型分析

【Git學習筆記】Git結構原理及其分支管理模型分析 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Git學習筆記 文章目錄 【Git學習筆記】Git結構原理及其分支管理模型分析前言一.認識工作區、暫存區、版本庫1.1 版本回退1.2 撤銷修改1.3 刪…

Scheme語言的壓力測試

Scheme語言的壓力測試 引言 Scheme是一種廣泛使用的函數式編程語言&#xff0c;它是Lisp語言家族的一員&#xff0c;以其簡潔性和強大的表達能力而聞名。在現代軟件開發中&#xff0c;施行壓力測試是一項關鍵技術&#xff0c;旨在評估系統在高負載或極端情況下的表現。在這篇…

[特殊字符]Windows 11 安裝 Git 圖文教程(含詳細配置說明)

Windows 11 安裝 Git 圖文教程(含詳細配置說明) 本教程適用于 Git 新手,手把手教你如何在 Windows 11 上完整安裝 Git 并正確配置,配圖清晰,步驟明確,建議收藏! ? 第一步:下載 Git 安裝包 訪問官網:https://git-scm.com自動識別系統后點擊下載或者直接前往:Git for …

簡單以太網配置

display arp //查看路由器mac地址 交換機配置命令&#xff1a; system-view // 從用戶視圖進入系統視圖 dis mac-address //查看mac地址表 路由器配置命令: system-view // 從用戶視圖進入系統視圖 int GigabitEthernet 0/0/0 //進入G口 0/0/0 進入之后配置網關: ip addre…

【GPT入門】第25課 掌握 LangChain:鏈式調用的奧秘、特性與使用示例

【GPT入門】第25課 掌握 LangChain&#xff1a;鏈式調用的奧秘、特性與使用示例 語法解釋各部分性質鏈式調用的性質調用方式注意事項 語法解釋 你給出的代碼 is_duplicated_chain (check_duplicated | model | parser) 運用了 LangChain 里的鏈式調用語法。在 LangChain 中&a…

二、vtkCommand的使用

一、概述 vtkCommand是VTK中的一個重要的類&#xff0c;用于處理事件和回調機制。它允許用戶在特定事件發生時執行自定義的操作&#xff0c;例如在交互操作、數據更新或渲染過程中觸發某些功能。 二、主要功能 1、事件處理&#xff1a;vtkCommand用于監聽和處理VTK管線中的各…

配置集群-日志聚集操作

1.修改配置文件 <!-- 開啟日志聚集功能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 設置日志聚集服務器地址 --> <property> <name>yarn.log.server.url&…

Linux系統上后門程序的原理細節,請仔細解釋一下

在Linux系統上&#xff0c;后門程序通常通過隱蔽的方式繞過正常的安全機制&#xff0c;允許攻擊者未經授權訪問系統。以下是其工作原理的詳細解釋&#xff1a; 1. 隱蔽性 隱藏進程&#xff1a;后門程序常通過修改進程列表或使用rootkit技術隱藏自身&#xff0c;避免被ps、top…

華為ipd流程華為流程體系管理華為數字化轉型流程數字化管理解決方案介紹81頁精品PPT

華為流程體系最佳實踐主要包括構建完善的流程框架&#xff0c;明確各層級流程要素與職責&#xff0c;梳理涵蓋研發、采購、營銷、服務、資產管理等多領域的流程&#xff0c;通過梳理業務場景和核心能力搭建差異化流程框架&#xff0c;采用自上而下與自下而上相結合的建模方法&a…

QT國產化系統軟件開發

一、國產操作系統 1、鴻蒙HarmonyOS NEXT ?核心架構? 采用自研鴻蒙內核&#xff0c;完全脫離Linux與AOSP代碼&#xff0c;基于分布式架構實現跨設備資源虛擬化整合&#xff0c;支持動態調度多終端硬件能力?。通過分布式軟總線技術&#xff08;D-Bus&#xff09;實現低時延…

Oracle常見系統函數

一、字符類函數 1&#xff0c;ASCII(c)和CHR(i)字符串和ascii碼互轉換 SQL> select ascii(Z) ,ascii(H),ascii( A) from dual;ASCII(Z) ASCII(H) ASCII(A) ---------- ---------- ----------90 72 32SQL> select chr(90),chr(72),chr(65) from dual;C…

python pytorch tensorflow transforms 模型培訓腳本

環境準備 https://www.doubao.com/thread/w5e26d6401c003bb2 執行培訓腳本 import torch from torch.utils.data import Dataset, DataLoader from transformers import DistilBertTokenizer, DistilBertForSequenceClassification, AdamW import numpy as np# 自定義數據集類…

request庫基礎學習

requests安裝 Windows &#xff1a;pip install requests mac &#xff1a; python3 -m pip install requests requests模塊常用方法 方法含義requests.get()發起get請求requests.post()發起post請求requests.put()發起put請求requests.delete()發起delete請求requests.sess…

Redis客戶端Jedis、Lettuce 和 Redisson優缺點總結

https://developer.huawei.com/consumer/cn/blog/topic/03825550899620047 Redis 官方推薦的 Java 客戶端有Jedis、Lettuce 和 Redisson。本文總結這些客服端的優缺點 1. Jedis Jedis 是老牌的 Redis 的 Java 實現客戶端&#xff0c;提供了比較全面的 Redis 命令的支持&#…

在 Spring Boot 中調用 AnythingLLM 的發消息接口

整體邏輯: 自建系統的web UI界面調用接口: 1.SpringBoot接口&#xff1a;/anything/chatMessageAnything 2.調用anythingLLM - 調用知識庫deepseek r1 . Windows Installation ~ AnythingLLMhttps://docs.anythingllm.com/installation-desktop/windows http://localhost:3…

kubectl describe pod 命令以及輸出詳情講解

kubectl describe pod 命令格式 kubectl describe pod <pod-name> -n <namespace><pod-name>&#xff1a;Pod 的名稱。 -n <namespace>&#xff1a;指定命名空間&#xff0c;默認是當前命名空間。 controlplane ~ ? kubectl describe pod newpods-d…

Python生成和安裝requirements.txt

概述 看到別的大佬項目中&#xff0c;requirements.txt文件&#xff0c;里面包含了所需要的依賴及版本&#xff0c;方便項目管理和安裝。 生成 requirements.txt 文件 pip3 freeze > requirements.txt生成的依賴包有點多&#xff0c;感覺可以根據自己需要整理。 安裝req…

WebGL學習2

WebGL&#xff08;Web Graphics Library&#xff09;是一種基于 OpenGL ES 2.0 的 JavaScript API&#xff0c;用于在網頁上實現高性能的 3D 圖形渲染。 1. 初始化 WebGL 上下文 在使用 WebGL 之前&#xff0c;需要獲取<canvas>元素并創建 WebGL 上下文。 // 獲取canv…

零知識證明:區塊鏈隱私保護的變革力量

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;…