單鏈表的反轉?太細了哥們!細到離譜!

單鏈表的反轉(面試常出):

? 單鏈表的反轉,可以通過很多種方法實現。包括迭代法,遞歸法,

  • 迭代法:

    1. 定義三個指針:prev、current和next,它們分別表示前一個節點、當前節點和下一個節點。

    2. 初始化時,prev為null,current為頭節點。

    3. 在循環中,不斷將current的next指針指向prev,然后依次向后移動prev、current和next指針。

    4. 當next為空時,說明已經到達鏈表末尾,此時的prev指向就是反轉后的頭節點。

    其實就像是先將第一個節點指向null,就像最后一個節點它也是next = null的;然后一直這樣子重復,轉一次就后退,讓下一個節點去轉方向指向前面的。

    在這里插入圖片描述

    public ListNode reverse(Node head) {Node prev = null;Node current = head;while (current != null) {Node nextTemp = current.next; // 暫存當前節點的下一個節點current.next = prev; // 將當前節點指向前一個節點prev = current; // 更新prev為當前節點current = nextTemp; // 更新current為原先的下一個節點}return prev; // 返回反轉后的頭節點}
    

    // 補充一個力扣第92題,加深理解(讓你把單鏈表部分元素反轉,其他部分不變)

  • 在這里插入圖片描述

? 這里依舊可以使用迭代的方法,就是要先通過遍歷去找到反轉開始的位置和結束的位置;用輔助節點記錄反轉區間的前置節點和反轉區間的尾節點。然后反轉區間的鏈表反轉即可,反轉后接上前面的部分。

在這里插入圖片描述

public ListNode reverseBetween(ListNode head, int left, int right) {ListNode current = head;ListNode prev = null;for (int i = 1; i < left; i++) {prev = current;current = current.next;}// 反轉區間的前置節點ListNode tailPrev = prev;// 反轉區間的尾節點ListNode tail = current;// 同樣的迭代原理,只是范圍要自定義。for (int j = left; j <= right; j++) {ListNode newTemp = current.next;current.next = prev;prev = current;current = newTemp;}// 反轉區間的頭節點ListNode headReverse = prev;tail.next = current;if (tailPrev != null) {tailPrev.next = headReverse;return head;} else {return headReverse;}
}

遞歸法:(也是力扣第206題)

? 遞歸的關鍵是看整體,找出整體的大塊東西。可以先寫一個偽代碼過一遍思路。你就寫基礎情況,然后要的操作,再看子問題(遞歸調用)放的位置即可。

**實操技巧:**第一步先找到可以看作整體的,就是原理一樣的。去設計遞歸調用(超級操作),第二步去設計微操作,去看一份整體的怎么實現即可。后面就去找到題目中的基礎情況,它相當于最里面的超級操作了,也基本就是剩下一個的情況那種。

相關概念:

? 1.首先先明確函數的意義,還要原問題和子問題。在這里原問題是給整個鏈表反轉,子問題是給每一個字節進行反轉。

? 2.基礎情況,也就是要找到結束的條件。就是當數據規模很小的時候,能結束遞歸,返回答案。

? 3.遞歸調用(超級操作),怎么搞定中間的遞歸操作。但是!唉!人腦進去遞歸出不來的。所以得完把遞歸的過程看成一個整體,不要去想里面怎么運行的。

? 4.微操作。也就是操作的方法。

? 比如漢諾塔問題,你有2個疊在一起的時候,就是先把小的放中間,大的放右邊,再把小的放大的上面。那這個時候,假如他有一堆,你就是把小的一堆給放到中間,讓最大的去到最右邊墊底。然后小的一堆整體放到大的上面。而那一堆小的移動其實就是整個問題的子問題,它其實就是可以用遞歸重復一個原理完成。

此題思路如下:

在這里插入圖片描述

// 定義:輸入一個單鏈表頭結點,將該鏈表反轉,返回新的頭結點
ListNode reverse(ListNode head) {// 基礎情況,也就是結束的代碼。// 鏈表為空或者只有一個節點時,直接返回頭節點即可。if (head == null || head.next == null) {return head;}// 遞歸調用(超級操作)ListNode last = reverse(head.next);// 而其實當你寫一個偽代碼時候,你也可以發現。下面的這個其實就是反轉需要的的操作,可以寫一個偽代碼,微操作。具體操作方法: operate(head.next); head.next.next = head;head.next = null;return last;
}

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

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

相關文章

NSGA-III求解微電網多目標優化調度(MATLAB)

一、NSGA-III簡介 NSGA-III算法由Kalyanmoy Deb和Himanshu Jain于 2014年提出。 參考文獻&#xff1a;Deb K , Jain H . An Evolutionary Many-Objective Optimization Algorithm Using Reference Point-Based Nondominated Sorting Approach, Part I: Solving Problems With …

[chroot+seccomp逃逸] THUCTF2019 之 固若金湯

題目分析 附件為一個源碼, 其中注釋我都寫好了, 主要就講關鍵的知識點. #define _GNU_SOURCE#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <sched.h> #include <uni…

【C/PTA —— 10.函數1(課外實踐)】

C/PTA —— 10.函數1&#xff08;課外實踐&#xff09; 一.函數題6-1 符號函數6-2 求排列數6-3 求一個大于10的n位整數w的后n-1位的數&#xff0c;并作為函數值返回。6-4 其右上三角&#xff08;含主對角線&#xff09;元素之和。6-5 字符串比較6-6 使用函數求素數和6-7 使用函…

【電子通識】為什么說做產品不是簡單的將不同的技術進行搭積木?

很多人說做產品的硬件工程師&#xff0c;其實就是將專項技術工程師已經調好的模塊進行拼接。類似于小孩將積木搭成一個房子的形狀&#xff0c;雖然不同人搭的房子風格迥異&#xff0c;但所使用的原材料卻都是一樣的。 首先我并不同意這種看法&#xff0c;原因是產品工程師是需要…

JVM深入理解

JVM深入理解&#xff08;一&#xff09; JVM是什么 JRE、JDK和JVM 的關系 JVM原理 1、JVM是什么&#xff1f; JVM是Java Virtual Machine&#xff08;Java虛擬機&#xff09;的縮寫&#xff0c;由一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域等組…

MediaCodec詳解

MediaCodec 是Android平臺提供的一個API&#xff0c;用于對音頻和視頻數據進行編碼&#xff08;轉換為不同的格式&#xff09;和解碼&#xff08;從一種格式轉換回原始數據&#xff09;。它是Android 4.1&#xff08;API級別16&#xff09;及以上版本的一部分&#xff0c;允許開…

Sulfo-CY5 Azide在其他生物學研究中的應用

除了生物成像、生物分子標記、分子生物學研究和生物傳感與診斷等領域外&#xff0c;Sulfo-CY5 Azide還在其他生物學研究中有多種應用&#xff0c;**(來自星戈瑞的花菁染料)**如下&#xff1a; ****細胞追蹤和細胞遷移研究&#xff1a;****Sulfo-CY5 Azide可以被用作細胞標記劑&…

【教3妹學編程-算法題】統計和小于目標的下標對數目

2哥 : 3妹&#xff0c;OpenAI的宮斗劇迎來了大結局&#xff01;OpenAI宣布阿爾特曼復職CEO&#xff0c;董事會重組 3妹&#xff1a;啊&#xff1f;到底誰才是幕后操縱者啊&#xff0c;有咩有揪出來 2哥 : 也不是很清楚&#xff0c;據說在被開除的幾周前&#xff0c;前CEO曾譴責…

Linux 家目錄和根目錄

摘要&#xff1a; 在 Linux 操作系統中&#xff0c;家目錄和根目錄是兩個非常重要的概念。它們是 Linux 文件系統中的兩個關鍵節點&#xff0c;為用戶和系統進程提供存儲、管理和訪問文件和目錄的接口。本文旨在深入探討和理解這兩個目錄的結構、功能和使用方式&#xff0c;同時…

行情分析 - - 加密貨幣市場大盤走勢(11.24)

大餅昨日震蕩幅度很小&#xff0c;而今天延續昨日的空頭思路。當然如果從MACD日線來看&#xff0c;處于上漲趨勢&#xff0c;穩健的可以選擇觀望等待。空頭思路是因為目前EMA21均線和EMA55均線依然保持很遠&#xff0c;最近兩個月BTC上漲40%&#xff0c;而最近持續保持高位很快…

同時可視化原始中心點和經過坐標轉換后的中心點

std::vector<Eigen::Vector2d> centroids_unknown_motion_underk;std::vector<Eigen::Vector2d> measurements_centroids_unknown_motion_k= transformLandmarks(centroids_unknown_motion_k, weights_pose); // 數據填充 // k時刻經過轉換到k-1時刻坐標系下的中心…

Twincat使用:EtherCAT通信掃描硬件設備鏈接PLC變量

EtherCAT通信采用主從架構&#xff0c;其中一個主站設備負責整個EtherCAT網絡的管理和控制&#xff0c;而從站設備則負責在數據環網上傳遞數據。 主站設備可以是計算機、工控機、PLC等&#xff0c; 而從站設備可以是傳感器、執行器、驅動器等。 EL3102:MDP5001_300_CF8D1684;…

Arduino驅動PT100數字K型高溫傳感器(溫濕度傳感器)

目錄 1、傳感器特性 2、控制器和傳感器連線圖 3、硬件原理圖 4、驅動程序 PT100適用于大部分400℃以下高溫的測量,但是通常家用天然氣灶焰芯溫度可達800℃以上,燒制陶瓷的窖子或者大功率電爐溫度更可超過1000℃,在這些超高溫度的場景下就需要用到K型熱電偶。

C# 無法將“int[]“類型隱式轉換為“int?[]“,無法將“string[]“類型隱式轉換為“string?[]“

在 C# 中&#xff0c;不能將 int[] 隱式轉換為 int?[]&#xff0c;因為它們是兩種不同的類型。int[] 是一個整數數組&#xff0c;而 int?[] 是一個可空整數數組。要解決這個問題&#xff0c;你可以使用顯式轉換或創建一個新的可空整數數組。 兩種解決方案供大家選擇 // 示例…

C++編程——輸入

#include<bits/stdc.h> using namespace std; int main(){//beginint a 0, b 0, c 0, d 0, e 0;char f1, f2;char g[30];scanf("%d", &a); //輸入整數并賦值給變量ascanf("%d", &b); //輸入整數并賦值給變量bscanf("%d", &…

關于愛普生L3219彩色噴墨打印機打印過程中噪聲過大的幾點緩解方法

故障描述&#xff1a; 一臺新購買的愛普生L3219使用過程中出現了噪聲過大的問題&#xff0c;每次打印或者復印都或有明顯的噪音過大的現象&#xff0c;目測觀察大概是打印機字車左右來回移動的時候剮蹭滑道的問題&#xff0c;與經銷商溝通后由經銷商聯系上級供貨商更換一臺全新…

CAN實驗

CAN 寄存器 HAL庫函數 代碼 #include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle; CAN_TxHeaderTypeDef g_can1_txheader; CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 8 TS2 7 BRP 3 波特率&#xff1a;36000 / [(9 8 1) * 4] 500Kbps …

Qt學習(2)

1.QObject 只有繼承了QObject類的類&#xff0c;才具有信號槽的能力。所以&#xff0c;為了使用信號槽&#xff0c;必須繼承QObject。凡是QObject類&#xff08;不管是直接子類還是間接子類&#xff09;&#xff0c;都應該在第一行代碼寫上Q_OBJECT。不管是不是使用信號槽&…

【Java 進階篇】Jedis 操作 String:Redis中的基礎數據類型

在Redis中&#xff0c;String是最基礎的數據類型之一&#xff0c;而Jedis作為Java開發者與Redis交互的利器&#xff0c;提供了豐富的API來操作String。本文將深入介紹Jedis如何操作Redis中的String類型數據&#xff0c;通過生動的代碼示例和詳細的解釋&#xff0c;讓你輕松掌握…

C# 中using關鍵字的使用

在C#中我們還是很有必要掌握using關鍵字的。 比如這樣&#xff1a; string path “D:\data.txt”; if (!File.Exists(path )) {File.Create(path); File.WriteAllText(path,"OK"); } 首先我創建…