国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表

這篇具有很好參考價值的文章主要介紹了【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言?

目錄

1、題目介紹

2、解題思路

2.1、暴力破解法

2.2、快慢指針反轉(zhuǎn)鏈表


【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

?文章來源地址http://www.zghlxwxcb.cn/news/detail-713940.html

1、題目介紹

原題鏈接:?234. 回文鏈表 - 力扣(LeetCode)

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

示例 1:

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

輸入:head = [1,2,2,1]
輸出:true?

示例 2:

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

輸入:head = [1,2]
輸出:false?

提示:?

  • 鏈表中節(jié)點數(shù)目在范圍[1, 10^5]?內(nèi)
  • 0 <= Node.val <= 9

進階:你能否用?O(n)?時間復(fù)雜度和?O(1)?空間復(fù)雜度解決此題?

2、解題思路

判斷回文,就是判斷是否是對稱的。有些朋友對于數(shù)組的回文判斷非常熟悉,但是對鏈表的回文判斷可能就無從下手了,其實都一樣的。有一種非常簡單的方式就是將鏈表轉(zhuǎn)化成數(shù)組,然后就是判斷該數(shù)組是否回文就可以了,這種方式統(tǒng)稱暴力破解法,簡單粗暴。下面就來先帶著大家看一下這道題的暴力破解法

2.1、暴力破解法

一共為兩個步驟:

  1. 復(fù)制鏈表值到數(shù)組列表中。
  2. 使用雙指針法判斷是否為回文。

首先按照題目要求的最大大小定義一個大小為100001的整型數(shù)組,接著通過循環(huán)遍歷將鏈表中每個結(jié)點的值取出放入數(shù)組中,最后通過兩個指針,一個從左一個從右分別判斷是否相等,只要遇到一個不相等就返回false,否則當(dāng)循環(huán)結(jié)束時返回true。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool isPalindrome(struct ListNode* head){
    int arr[100001] = {0},num = 0;
    while(head)
    {
        arr[num] = head->val;
        head = head->next;
        num++;
    }
    int i= 0;
    int j =0;
    for(i = 0,j = num-1; i<j; i++,j--)
    {
        if(arr[i]!=arr[j])
        {
            return false;
        }
    }
    return true;
}

時間復(fù)雜度:O(n),其中 n 指的是鏈表的元素個數(shù)。

  • 第一步:遍歷鏈表并將值復(fù)制到數(shù)組中,O(n)。
  • 第二步:雙指針判斷是否為回文,執(zhí)行了 O(n/2) 次的判斷,即O(n)。
  • 總的時間復(fù)雜度:O(2n)=O(n)。

空間復(fù)雜度:O(n),其中 n 指的是鏈表的元素個數(shù),我們使用了一個數(shù)組列表存放鏈表的元素值。

進階:你能否用?O(n)?時間復(fù)雜度和?O(1)?空間復(fù)雜度解決此題?

下面帶大家做一下本題的進階,使用快慢指針反轉(zhuǎn)鏈表實現(xiàn)空間復(fù)雜度為O(1)的算法。

2.2、快慢指針反轉(zhuǎn)鏈表

整個流程可以分為以下五個步驟:

  1. 找到前半部分鏈表的尾節(jié)點。
  2. 反轉(zhuǎn)后半部分鏈表。
  3. 判斷是否回文。
  4. 恢復(fù)鏈表。
  5. 返回結(jié)果。

對于第一步找到前半部分鏈表的尾結(jié)點,我們可以計算鏈表結(jié)點個數(shù)然后再找到前半部分的尾結(jié)點,也可以通過快慢指針一次遍歷找到前半部分的尾結(jié)點。

慢指針一次走一步,快指針一次走兩步,快慢指針同時出發(fā)。當(dāng)快指針移動到鏈表的末尾時,慢指針恰好到鏈表的中間。通過慢指針將鏈表分為兩部分。

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

此時slow就是前半部分的尾結(jié)點,而slow的下一個結(jié)點就是后半部分的頭結(jié)點。于是讓fast回到slow的next結(jié)點處,將后半部分的結(jié)點全部反轉(zhuǎn),然后slow即前半部分的尾結(jié)點置空。

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

緊接著將讓slow從head重新出發(fā),fast從最后結(jié)點出發(fā),分別向中間結(jié)點靠近并判斷,只要相等就一直向中間靠近,遇到不相同時直接返回false,否則當(dāng)循環(huán)退出時返回true。

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言

最后在將反轉(zhuǎn)鏈表還原回去即可。?

?代碼實現(xiàn):

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool isPalindrome(struct ListNode* head){
    if(head == NULL || head->next == NULL)
    {
        return true;
    }
    struct ListNode* n1 = head;
    struct ListNode* n2 = head;
    //快慢指針遍歷
    while(n2->next != NULL && n2->next->next != NULL)
    {
        n1 = n1->next;          //慢指針
        n2 = n2->next->next;    //快指針 
    }
    n2 = n1->next;   //右邊第一個
    n1->next = NULL;
    struct ListNode* n3;
    //反轉(zhuǎn)右半邊鏈表
    while(n2 != NULL)
    {
        n3 = n2->next;  //n3存放n2的next
        n2->next = n1;
        n1 = n2;
        n2 = n3;
    }
    //當(dāng)循環(huán)結(jié)束時n1所指向的位置就是鏈表最后一個結(jié)點,
    n2 = n3 = n1;  //將n2和n3指回最后一個節(jié)點
    n1 = head;     //n1回到頭結(jié)點
    bool flag = true;
    //判斷是否是回文
    while(n1 != NULL && n2 != NULL)
    {
        if(n1->val != n2->val)
        {
            flag = false;
            break;
        }
        n1 = n1->next;
        n2 = n2->next;
    }
    //還原鏈表
    n2 = n3->next;    //n3此時指向最后一個結(jié)點,因為反轉(zhuǎn)了鏈表,n3的next就是上一個結(jié)點
    n3->next = NULL;
    while(n2!=NULL)
    {
        n1 = n2->next;
        n2->next = n3;
        n3 = n2;
        n2 = n1;
    }

    return flag;
}

時間復(fù)雜度:O(n),其中 n 指的是鏈表的大小。

空間復(fù)雜度:O(1)。我們只會修改原本鏈表中節(jié)點的指向,而在堆棧上的堆棧幀不超過 O(1)。

?更多【LeetCode刷題】?推薦:

【LeetCode力扣】86. 分隔鏈表-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/133942678?spm=1001.2014.3001.5501【LeetCode力扣】297. 二叉樹的序列化與反序列化-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/133827375【LeetCode力扣】LCR170 使用歸并排序的思想解決逆序?qū)栴}(詳細圖解)_Hacynn的博客-CSDN博客https://blog.csdn.net/zzzzzhxxx/article/details/133578735

【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表,LeetCode刷題,leetcode,鏈表,算法,數(shù)據(jù)結(jié)構(gòu),開發(fā)語言,c++,c語言?

如果覺得作者寫的不錯,求給博主一個大大的點贊支持一下,你們的支持是我更新的最大動力!

如果覺得作者寫的不錯,求給博主一個大大的點贊支持一下,你們的支持是我更新的最大動力!

如果覺得作者寫的不錯,求給博主一個大大的點贊支持一下,你們的支持是我更新的最大動力!

?

到了這里,關(guān)于【LeetCode力扣】234 快慢指針 | 反轉(zhuǎn)鏈表 | 還原鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • LeetCode算法小抄 -- 鏈表(快慢指針、雙指針、回文鏈表)

    ?申明: 未經(jīng)許可,禁止以任何形式轉(zhuǎn)載,若要引用,請標(biāo)注鏈接地址。 全文共計10077字,閱讀大概需要10分鐘 ??更多學(xué)習(xí)內(nèi)容, 歡迎??關(guān)注??文末我的個人微信公眾號:不懂開發(fā)的程序猿 個人網(wǎng)站:https://jerry-jy.co/ Collection 子接口之 Queue (LeetCode上經(jīng)常用,手撕算法題!

    2023年04月08日
    瀏覽(22)
  • LeetCode - 142. 環(huán)形鏈表 II (C語言,快慢指針,配圖)

    LeetCode - 142. 環(huán)形鏈表 II (C語言,快慢指針,配圖)

    ? ? ? ? 如果你對快慢指針,環(huán)形鏈表有疑問,可以參考下面這篇文章,了解什么是環(huán)形鏈表后,再做這道題會非常簡單,也更容易理解下面的圖片公式等。 LeetCode - 141. 環(huán)形鏈表 (C語言,快慢指針,配圖)-CSDN博客 ? ? ? ? 上述文章總結(jié): 如果一個鏈表是環(huán)形鏈表,采用

    2024年02月05日
    瀏覽(91)
  • 【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    題目鏈接:344. 反轉(zhuǎn)字符串 題目內(nèi)容: 題目中重點強調(diào)了必須 原地修改 輸入數(shù)組,即不能新建一個數(shù)組來完成字符串的反轉(zhuǎn)。我們注意到: 原來下標(biāo)為0的,反轉(zhuǎn)后是size - 1【原來下標(biāo)是size - 1的,反轉(zhuǎn)后是0】; 原來下標(biāo)是1的,反轉(zhuǎn)后是size - 2【原來下標(biāo)是size -2的,反轉(zhuǎn)后

    2024年02月11日
    瀏覽(33)
  • Leetcode刷題之反轉(zhuǎn)鏈表Ⅱ

    Leetcode刷題之反轉(zhuǎn)鏈表Ⅱ

    業(yè)精于勤而荒于嬉,行成于思而毀于隨。? ? ? ? ? ? ? ? ? ? ? ——韓愈 目錄 前言: ??一.反轉(zhuǎn)鏈表Ⅱ ??1.left和right中間鏈表反轉(zhuǎn),再把反轉(zhuǎn)鏈表和剩下的鏈接起來 ??2.left和right中間鏈表頭插? 題目描述: 給你單鏈表的頭指針 head 和兩個整數(shù)?left 和 right ,其中?left =

    2024年02月04日
    瀏覽(27)
  • LeetCode | 一探環(huán)形鏈表的奧秘【快慢雙指針妙解BAT等大廠經(jīng)典算法題】

    LeetCode | 一探環(huán)形鏈表的奧秘【快慢雙指針妙解BAT等大廠經(jīng)典算法題】

    前言 本文總結(jié)了力扣141.環(huán)形鏈表|以及142.環(huán)形鏈表||這兩道有關(guān)環(huán)形鏈表的求解方案,去求證鏈表是否帶環(huán)已經(jīng)如何找出入環(huán)口的結(jié)點。 有關(guān)環(huán)形鏈表,在BAT等大廠面試中均有出現(xiàn),一般是屬于 中等難度 的題,需掌握 原題傳送門 給你一個鏈表的頭節(jié)點 head ,判斷鏈表中是

    2024年02月01日
    瀏覽(25)
  • 力扣每日一道系列 --- LeetCode 206. 反轉(zhuǎn)鏈表

    力扣每日一道系列 --- LeetCode 206. 反轉(zhuǎn)鏈表

    ?? 江池俊: 個人主頁 ??個人專欄: ?數(shù)據(jù)結(jié)構(gòu)探索 ?LeetCode每日一道 ?? 有航道的人,再渺小也不會迷途。 LeetCode 206. 反轉(zhuǎn)鏈表 初始化兩個指針, cur 和 newhead 。 cur 指向給定的鏈表頭節(jié)點, newhead 初始為 NULL 。 在 cur 不為空的情況下,執(zhí)行循環(huán)。 首先,記錄下 cur 的下

    2024年02月04日
    瀏覽(19)
  • 反轉(zhuǎn)鏈表、鏈表的中間結(jié)點、合并兩個有序鏈表【LeetCode刷題日志】

    反轉(zhuǎn)鏈表、鏈表的中間結(jié)點、合并兩個有序鏈表【LeetCode刷題日志】

    給你單鏈表的頭節(jié)點 head ,請你反轉(zhuǎn)鏈表,并返回反轉(zhuǎn)后的鏈表。 力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺 這里解釋一下三個指針的作用: n1:記錄上一個節(jié)點,如果是第一個就指向空 n2:記錄此節(jié)點的位置 n3:記錄下一個節(jié)點的位置,讓翻轉(zhuǎn)后能找到下一個節(jié)點

    2024年02月03日
    瀏覽(24)
  • 【刷題筆記8.15】【鏈表相關(guān)】LeetCode:合并兩個有序鏈表、反轉(zhuǎn)鏈表

    【刷題筆記8.15】【鏈表相關(guān)】LeetCode:合并兩個有序鏈表、反轉(zhuǎn)鏈表

    將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。 輸入:l1 = [1,2,4], l2 = [1,3,4] 輸出:[1,1,2,3,4,4] 示例 2: 輸入:l1 = [], l2 = [] 輸出:[] 示例 3: 輸入:l1 = [], l2 = [0] 輸出:[0] 此題沒啥好說的,直接上代碼,自己好好分析

    2024年02月12日
    瀏覽(31)
  • 刷題日記 Day 3 : Leetcode 203 . 移除鏈表元素、Leetcode 707 . 設(shè)計鏈表、Lettcode 206 . 反轉(zhuǎn)鏈表

    刷題日記 Day 3 : Leetcode 203 . 移除鏈表元素、Leetcode 707 . 設(shè)計鏈表、Lettcode 206 . 反轉(zhuǎn)鏈表

    本篇文章 , 是在代碼隨想錄 60 天編程挑戰(zhàn)的基礎(chǔ)上進行的題目講解 參與鏈接在此 : https://programmercarl.com/other/xunlianying.html 大家好 , 這個專欄 , 給大家?guī)淼氖?60 天刷題強訓(xùn) . 最令大家頭疼的事就是刷題了 , 題目又臭又長又抽象 , 有的題讀都讀不懂 , 更別說做了 . 所以 , 這個

    2023年04月09日
    瀏覽(23)
  • 【leetcode 力扣刷題】移除鏈表元素 多種解法

    【leetcode 力扣刷題】移除鏈表元素 多種解法

    題目鏈接:203.移除鏈表元素 題目內(nèi)容: 理解題意:就是單純的刪除鏈表中所有值等于給定的val的節(jié)點。上一篇博客中介紹了鏈表的基礎(chǔ)操作,在刪除鏈表中節(jié)點時,需要注意的是頭節(jié)點: 如果沒有虛擬頭節(jié)點,那么對頭節(jié)點的刪除需要做不同的處理,head = head-next; 如果有

    2024年02月12日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包