日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

递归删除单链表中所有值为x的元素_如何纯递归反转链表的一部分

發布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递归删除单链表中所有值为x的元素_如何纯递归反转链表的一部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讀完本文,你可以去力扣拿下如下題目:

92.反轉鏈表II

-----------

反轉單鏈表的迭代實現不是一個困難的事情,但是遞歸實現就有點難度了,如果再加一點難度,讓你僅僅反轉單鏈表中的一部分,你是否能夠遞歸實現呢?

本文就來由淺入深,step by step 地解決這個問題。如果你還不會遞歸地反轉單鏈表也沒關系,本文會從遞歸反轉整個單鏈表開始拓展,只要你明白單鏈表的結構,相信你能夠有所收獲。

// 單鏈表節點的結構 public class ListNode {int val;ListNode next;ListNode(int x) { val = x; } }

什么叫反轉單鏈表的一部分呢,就是給你一個索引區間,讓你把單鏈表中這部分元素反轉,其他部分不變:
e

注意這里的索引是從 1 開始的。迭代的思路大概是:先用一個 for 循環找到第 m 個位置,然后再用一個 for 循環將 m 和 n 之間的元素反轉。但是我們的遞歸解法不用一個 for 循環,純遞歸實現反轉。

迭代實現思路看起來雖然簡單,但是細節問題很多的,反而不容易寫對。相反,遞歸實現就很簡潔優美,下面就由淺入深,先從反轉整個單鏈表說起。

一、遞歸反轉整個鏈表

這個算法可能很多讀者都聽說過,這里詳細介紹一下,先直接看實現代碼:

ListNode reverse(ListNode head) {if (head.next == null) return head;ListNode last = reverse(head.next);head.next.next = head;head.next = null;return last; }

看起來是不是感覺不知所云,完全不能理解這樣為什么能夠反轉鏈表?這就對了,這個算法常常拿來顯示遞歸的巧妙和優美,我們下面來詳細解釋一下這段代碼。

對于遞歸算法,最重要的就是明確遞歸函數的定義。具體來說,我們的 reverse 函數定義是這樣的:

輸入一個節點 head,將「以 head 為起點」的鏈表反轉,并返回反轉之后的頭結點。

明白了函數的定義,在來看這個問題。比如說我們想反轉這個鏈表:

那么輸入 reverse(head) 后,會在這里進行遞歸:

ListNode last = reverse(head.next);

不要跳進遞歸(你的腦袋能壓幾個棧呀?),而是要根據剛才的函數定義,來弄清楚這段代碼會產生什么結果:

這個 reverse(head.next) 執行完成后,整個鏈表就成了這樣:

并且根據函數定義,reverse 函數會返回反轉之后的頭結點,我們用變量 last 接收了。

PS:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

現在再來看下面的代碼:

head.next.next = head;

接下來:

head.next = null; return last;

神不神奇,這樣整個鏈表就反轉過來了!遞歸代碼就是這么簡潔優雅,不過其中有兩個地方需要注意:

1、遞歸函數要有 base case,也就是這句:

if (head.next == null) return head;

意思是如果鏈表只有一個節點的時候反轉也是它自己,直接返回即可。

2、當鏈表遞歸反轉之后,新的頭結點是 last,而之前的 head 變成了最后一個節點,別忘了鏈表的末尾要指向 null:

head.next = null;

理解了這兩點后,我們就可以進一步深入了,接下來的問題其實都是在這個算法上的擴展。

二、反轉鏈表前 N 個節點

這次我們實現一個這樣的函數:

// 將鏈表的前 n 個節點反轉(n <= 鏈表長度) ListNode reverseN(ListNode head, int n)

比如說對于下圖鏈表,執行 reverseN(head, 3):

解決思路和反轉整個鏈表差不多,只要稍加修改即可:

ListNode successor = null; // 后驅節點// 反轉以 head 為起點的 n 個節點,返回新的頭結點 ListNode reverseN(ListNode head, int n) {if (n == 1) { // 記錄第 n + 1 個節點successor = head.next;return head;}// 以 head.next 為起點,需要反轉前 n - 1 個節點ListNode last = reverseN(head.next, n - 1);head.next.next = head;// 讓反轉之后的 head 節點和后面的節點連起來head.next = successor;return last; }

具體的區別:

1、base case 變為 n == 1,反轉一個元素,就是它本身,同時要記錄后驅節點。

2、剛才我們直接把 head.next 設置為 null,因為整個鏈表反轉后原來的 head 變成了整個鏈表的最后一個節點。但現在 head 節點在遞歸反轉之后不一定是最后一個節點了,所以要記錄后驅 successor(第 n + 1 個節點),反轉之后將 head 連接上。

OK,如果這個函數你也能看懂,就離實現「反轉一部分鏈表」不遠了。

PS:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

三、反轉鏈表的一部分

現在解決我們最開始提出的問題,給一個索引區間 [m,n](索引從 1 開始),僅僅反轉區間中的鏈表元素。

ListNode reverseBetween(ListNode head, int m, int n)

首先,如果 m == 1,就相當于反轉鏈表開頭的 n 個元素嘛,也就是我們剛才實現的功能:

ListNode reverseBetween(ListNode head, int m, int n) {// base caseif (m == 1) {// 相當于反轉前 n 個元素return reverseN(head, n);}// ... }

如果 m != 1 怎么辦?如果我們把 head 的索引視為 1,那么我們是想從第 m 個元素開始反轉對吧;如果把 head.next 的索引視為 1 呢?那么相對于 head.next,反轉的區間應該是從第 m - 1 個元素開始的;那么對于 head.next.next 呢……

區別于迭代思想,這就是遞歸思想,所以我們可以完成代碼:

ListNode reverseBetween(ListNode head, int m, int n) {// base caseif (m == 1) {return reverseN(head, n);}// 前進到反轉的起點觸發 base casehead.next = reverseBetween(head.next, m - 1, n - 1);return head; }

至此,我們的最終大 BOSS 就被解決了。

PS:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種算法套路后投再入題海就如魚得水了。

四、最后總結

遞歸的思想相對迭代思想,稍微有點難以理解,處理的技巧是:不要跳進遞歸,而是利用明確的定義來實現算法邏輯。

處理看起來比較困難的問題,可以嘗試化整為零,把一些簡單的解法進行修改,解決困難的問題。

值得一提的是,遞歸操作鏈表并不高效。和迭代解法相比,雖然時間復雜度都是 O(N),但是迭代解法的空間復雜度是 O(1),而遞歸解法需要堆棧,空間復雜度是 O(N)。所以遞歸操作鏈表可以作為對遞歸算法的練習或者拿去和小伙伴裝逼,但是考慮效率的話還是使用迭代算法更好。

_____________

我的 在線電子書 有 100 篇原創文章,手把手帶刷 200 道力扣題目,建議收藏!對應的 GitHub 算法倉庫 已經獲得了 70k star,歡迎標星!

總結

以上是生活随笔為你收集整理的递归删除单链表中所有值为x的元素_如何纯递归反转链表的一部分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产做爰免费视频观看 | 国产午夜手机精彩视频 | 亚洲操图 | 日本久久久久 | 国产手机av在线 | 伊人一区二区三区四区 | 日韩理论片在线观看 | 2024av视频| 天天色成人网 | 日本高清精品 | 99综合久久 | 中国丰满老妇xxxxx交性 | 91av观看 | 中文资源在线观看 | 妖精视频一区二区 | 欧美日韩专区 | av大片免费看| 成年人小视频在线观看 | 精品无码久久久久成人漫画 | 精品午夜视频 | 黄色伊人网 | www.婷婷| 中文在线免费看视频 | 亚洲国产精品av | 色婷婷精品久久二区二区密 | 国产二区视频在线观看 | 亚洲av成人无码久久精品老人 | 麻豆视屏| 中文在线视频 | 50一60岁老妇女毛片 | 久久精品欧美日韩 | 久久久精品国产 | 麻豆精品在线 | 高清欧美性猛交xxxx黑人猛交 | 久久老女人 | 亚洲国产av一区二区 | 男女操操操| 学生孕妇videosex性欧美 | 久久伊人中文字幕 | 日日操夜夜撸 | 亚洲高清免费观看 | 欧美xxxxav| 亚洲一区不卡 | 国内黄色一级片 | 在线观看污污视频 | 亚洲一区二区美女 | 一级黄色大片免费 | 亚洲精品女人 | 成人黄色一级视频 | 久久永久视频 | 国产精品久久久亚洲 | 欧美综合一区二区三区 | 香蕉精品在线 | 婷婷久久网 | 日韩小视频网站 | 长河落日电视连续剧免费观看 | 久久精品成人一区二区三区蜜臀 | 欧美性色网站 | 日韩性大片 | 天天综合天天做 | 下面一进一出好爽视频 | 欧美色鬼 | 日韩大片免费 | 久久免费在线观看视频 | 香蕉久久国产av一区二区 | www.97视频| 性做久久 | 午夜婷婷网 | 欲色影音| 亚洲国产婷婷 | 91国语对白 | 亚洲最大黄色网址 | 欧美三级电影在线观看 | 韩国精品一区二区 | 久久久激情| 乱色专区 | 欧美xo影院| 欧美jizz19性欧美 | 人妻熟女一区二区aⅴ水 | 全部免费毛片在线播放高潮 | 国产伦精品一区二区三区视频黑人 | 日夜夜操 | 日本精品网 | 韩日av网站 | 视频h在线 | 亚洲字幕 | 性xxxxxxxxx18欧美 | 成人在线观看视频网站 | 亚洲精品av中文字幕在线在线 | 欧美一区二区久久久 | 夜夜爽av| 精品久久久久久久久久久久久久久 | 日韩一卡二卡在线 | 五月激情小说 | 淫五月| 亚洲爽爽网 | 中国肥胖女人真人毛片 | 日韩福利网 | 精品国产一区二区三区无码 |