【數據結構】經典鏈表題目詳解集合(反轉鏈表、相交鏈表、鏈表的中間節點、回文鏈表)

文章目錄

  • 一、反轉鏈表
    • 1、程序詳解
    • 2、代碼
  • 二、相交鏈表
    • 1、程序詳解
    • 2、代碼
  • 三、鏈表的中間節點
    • 1、程序詳解
    • 2、代碼
  • 四、回文鏈表
    • 1、程序詳解
    • 2、代碼

一、反轉鏈表

1、程序詳解

題目:給定單鏈表的頭節點 head ,請反轉鏈表,并返回反轉后的鏈表的頭節點。

示例 :(將鏈表逆置)
在這里插入圖片描述

  1. 方法一:創建新鏈表。 遍歷原鏈表,并將節點依次頭插到新鏈表中。
  2. 方法二:創建三個指針 。 通過指針的不斷移動,依次完成反轉
    創建三個結構體指針:n1、n2、n3
    令 n1指向空,n2指向頭節點,n3指向頭結點的下一個節點
    在這里插入圖片描述
    分為兩個步驟:
    1、n2->next=n1, 令n2指向n1
    2、n1、n2、n3不斷向后移動
    在這里插入圖片描述

2、代碼

struct ListNode* reverseList(struct ListNode* head){if(head==NULL)return head;struct ListNode* n1, *n2, *n3;n1=NULL, n2=head, n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}

二、相交鏈表

1、程序詳解

題目:給你兩個單鏈表的頭節點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節點。如果兩個鏈表不存在相交節點,返回 null 。
在這里插入圖片描述
注:根據一個節點只能有一個next,相交鏈表一定是Y型的。

當然也有兩種方法:(一定要用地址來判斷)

  • 方法一:暴力求解,雙層循環。
    A鏈表中的節點依次與B鏈表中的所有節點相比較,此時,時間復雜度為O(N^2)
  • 方法二:雙指針
    1、找出A鏈表與B鏈表長度,相減得差值k
    2、讓長鏈表的指針先走k步
    3、A與B的指針同時走,并相比較
    在這里插入圖片描述

2、代碼

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode * curA = headA, *curB = headB;int len1 = 1, len2=1;  //用len1,len2來記錄兩鏈表的長度,但在循環里面少記錄一個,故初始化為1while(curA->next){curA = curA->next;len1++;}while(curB->next){curB = curB->next;len2++;}//若尾節點不相等,則兩鏈表一定不相交if(curA != curB){return NULL;}//相交//找出長鏈表和短鏈表struct ListNode * longList = headA, *shortList = headB;int gre = abs(len1-len2);if(len1<len2){longList = headB;shortList = headA;}//找出長短鏈表后,讓長鏈表先走差步while(gre--){longList = longList->next;}//兩鏈表同時走while(longList != shortList){longList = longList->next;shortList = shortList->next;}return longList;
}

三、鏈表的中間節點

1、程序詳解

題目:給你單鏈表的頭結點 head ,請你找出并返回鏈表的中間結點。

如果有兩個中間結點,則返回第二個中間結點。
在這里插入圖片描述

  • 方法:快慢指針
    若使快指針的速度始終是慢指針的二倍,那么當快指針走到鏈表結尾,慢指針剛好走到鏈表的中間。
    在這里插入圖片描述

2、代碼

struct ListNode* middleNode(struct ListNode* head) {//快慢指針,快指針走兩步,慢指針走一步struct ListNode* fast = head, *slow = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}

四、回文鏈表

1、程序詳解

題目:給你一個單鏈表的頭節點 head ,請你判斷該鏈表是否為
回文鏈表。如果是,返回 true ;否則,返回 false 。
在這里插入圖片描述

  • 方法:
    1、找到中間節點
    2、將中間節點之后的節點進行反轉
    3、將中間節點之前的與反轉后的節點 的val值進行比較

故回文鏈表綜合了 反轉鏈表與鏈表的中間節點,了解了這兩個題目方法后,我們只需寫進行比較的代碼。
在這里插入圖片描述

2、代碼

//找中間節點
struct ListNode *fac1(struct ListNode * head)
{struct ListNode * fast=head, *slow=head;while(fast && fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}
//反轉
struct ListNode *fac2(struct ListNode * head)
{struct ListNode * n1, *n2, *n3;n1=NULL, n2=head, n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}
bool isPalindrome(struct ListNode* head) {struct ListNode * mid = fac1(head);struct ListNode * rmid = fac2(mid);//進行比較while(rmid && head){if(rmid->val != head->val)return false;rmid=rmid->next;head=head->next;}return true;
}

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

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

相關文章

理解注意力機制與多頭注意力:深度學習中的“聚焦術”

Attention 理解注意力機制與多頭注意力&#xff1a;深度學習中的“聚焦術”什么是注意力機制&#xff1f;**核心思想** 什么是多頭注意力機制&#xff1f;**工作原理** **多頭注意力的優勢****應用領域****結論** 理解注意力機制與多頭注意力&#xff1a;深度學習中的“聚焦術”…

MLIR

方言 簡介操作塊區域值范圍Control Flow and SSACFG Regions 操作與多區域&#xff08;Operations with Multiple Regions&#xff09;閉包&#xff08;Closure&#xff09;圖形區域&#xff08;Graph Regions&#xff09;參數和結果&#xff08;Arguments and Results&#xf…

vscode編輯keil工程

1.編碼問題 通常keil默認amsi格式&#xff0c;vscode默認utf-8格式&#xff0c;直接打開會出現亂碼問題。 解決過程&#xff1a; 1.想著創建keil階段&#xff0c;就使用utf-編碼格式。 在區域設置里面“選擇beta版&#xff0c;提供全球utf-8 提供全球語言支持”&#xff0c…

JVM專題之內存模型以及如何判定對象已死問題

體驗與驗證 2.4.5.1 使用visualvm **visualgc插件下載鏈接 :https://visualvm.github.io/pluginscenters.html https://visualvm.github.io/pluginscenters.html **選擇對應JDK版本鏈接--->Tools--->Visual GC** 2.4.5.2 堆內存溢出 * **代碼** java @RestCont…

從0制作自己的ros導航小車(01、準備工作)

@TOC 前言 本篇說明需要具備的知識和軟硬件。可以不用全部具備,但基礎要有,寫的不是非常詳細。 本小車分為上位機與下位機兩部分,上位機使用旭日x3派運行ros進行開發和算法實現,下位機使用stm32驅動底盤和傳感器數據采集。 一、知識 ①stm32部分(當然也可以使用其它控制…

uniapp/Android App上架三星市場需要下載所需要的SDK

只需添加以下一個權限在AndroidManifest.xml <uses-permission android:name"com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>uniapp開發的&#xff0c;需要在App權限配置中加入以上的額外權限&#xff1a;

1958.力扣每日一題7/7 Java(100%解)

博客主頁&#xff1a;音符猶如代碼系列專欄&#xff1a;算法練習關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? 目錄 思路 解題方法 時間復雜度 空間復雜度 Code 思路 首先將指定位…

游戲開發面試題5

什么是進程、線程、協程 進程 進程是計算機的一種基本運行單位&#xff0c;由操作系統管理資源和分配資源的基本單位&#xff0c;進程可以理解為一個正在運行的程序 線程 線程是計算機的一種獨立執行單元&#xff0c;是操作系統能夠進行運算調度的基本單位&#xff0c;線程之間…

排序 -- 手撕歸并排序(遞歸和非遞歸寫法)

一、基本思想 歸并排序&#xff08;MERGE-SORT&#xff09;是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每個子序列有…

漢諾塔與青蛙跳臺階

1.漢諾塔 根據漢諾塔 - 維基百科 介紹 1.1 背景 最早發明這個問題的人是法國數學家愛德華盧卡斯。 傳說越南河內某間寺院有三根銀棒&#xff0c;上串 64 個金盤。寺院里的僧侶依照一個古老的預言&#xff0c;以上述規則移動這些盤子&#xff1b;預言說當這些盤子移動完畢&am…

SpringMVC(2)——controller方法參數與html表單對應

controller方法參數與html表單對應 0. User實體類 import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map;public class User implements Serializable {private …

ES7210高性能四通道音頻ADC轉換模擬麥克風為IIS數字咪頭

特征 高性能多位 Delta-Σ 音頻 ADC 102 dB 信噪比 -85 分貝 THDN 24 位&#xff0c;8 至 100 kHz 采樣頻率 I2S/PCM 主串行數據端口或從串行數據端口 支持TDM 256/384Fs、USB 12/24 MHz 和其他非標準音頻系統時鐘 低功耗待機模式 應用 麥克風陣列 智能音箱 遠場語音捕獲 訂購…

微服務的分布式事務解決方案

微服務的分布式事務解決方案 1、分布式事務的理論模型1.1、X/Open 分布式事務模型1.2、兩階段提交協議1.3、三階段提交協議 2、分布式事務常見解決方案2.1、TCC補償型方案2.2、基于可靠性消息的最終一致性方案2.3、最大努力通知型方案 3、分布式事務中間件 Seata3.1、AT 模式3.…

人工智能在軟件開發中的角色:助手還是取代者?

人工智能在軟件開發中的角色&#xff1a;助手還是取代者&#xff1f; 隨著科技的飛速發展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在軟件開發領域的應用越來越廣泛。從代碼生成、錯誤檢測到自動化測試&#xff0c;AI工具正成為開發者的重要助手。然而&#xf…

Postgresql - 用戶權限數據庫

1、綜述 在實際的軟件項目開發過程中&#xff0c;用戶權限控制可以說是所有運營系統中必不可少的一個重點功能&#xff0c;根據業務的復雜度&#xff0c;設計的時候可深可淺&#xff0c;但無論怎么變化&#xff0c;設計的思路基本都是圍繞著用戶、部門、角色、菜單這幾個部分展…

Django QuerySet對象,filter()方法

filter()方法 用于實現數據過濾功能&#xff0c;相當于sql語句中的where子句。 filter(字段名__exact10) 或 filter(字段名10)類似sql 中的 10 filter(字段名__gt10) 類似SQL中的 >10 filter(price__lt29.99) 類似sql中的 <29.99 filter(字段名__gte10, 字段名__lte20…

程序升級bootloader

文章目錄 概述什么是bootloader&#xff1f;為什么用&#xff1f;bootloader啟動流程圖步驟 下載過程代碼獲取本地配置信息獲取主機傳過來的配置信息bootloader發送2給上位機&#xff0c;上位機發送文件給bootloader根據網站復制CRC 燒寫flasherase啟動編譯問題 概述 用keil編…

聲明隊列和交換機 + 消息轉換器

目錄 1、聲明隊列和交換機 方法一&#xff1a;基于Bean的方式聲明 方法二&#xff1a;基于Spring注解的方式聲明 2、消息轉換器 1、聲明隊列和交換機 方法一&#xff1a;基于Bean的方式聲明 注&#xff1a;隊列和交換機的聲明是放在消費者這邊的&#xff0c;這位發送的人他…

Dynamic Web Module facet version問題

The default superclass, "javax.servlet.http.HttpServlet", according to the projects Dynamic Web Module facet version (3.1), was not found on the Java Build Path. 1.右鍵項目 2.點擊Properties 3.點擊Java Build Path&#xff0c;右邊找到Libraries&…

大模型在營銷領域的探索及創新

1 AIGA介紹 2 AIGA在營銷領域的 應用和探索 3 總結與展望