最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++相交鏈表和反轉(zhuǎn)鏈表詳解

 更新時間:2021年08月19日 10:27:06   作者:久病成良醫(yī)  
這篇文章主要介紹了C++相交鏈表和反轉(zhuǎn)鏈表,結(jié)合實例形式分析了C++相交鏈表和反轉(zhuǎn)鏈表的原理、實現(xiàn)方法及相關(guān)注意事項,需要的朋友可以參考下

給你兩個單鏈表的頭節(jié)點 headA 和 headB ,請你找出并返回兩個單鏈表相交的起始節(jié)點。如果兩個鏈表沒有交點,返回 null 。

在這里插入圖片描述

思路

簡單來說,就是求兩個鏈表交點節(jié)點的 指針。 這里同學(xué)們要注意,交點不是數(shù)值相等,而是指針相等。

為了方便舉例,假設(shè)節(jié)點元素數(shù)值相等,則節(jié)點指針相等。

看如下兩個鏈表,目前curA指向鏈表A的頭結(jié)點,curB指向鏈表B的頭結(jié)點:

在這里插入圖片描述

我們求出兩個鏈表的長度,并求出兩個鏈表長度的差值,然后讓curA移動到,和curB 末尾對齊的位置,如圖:

在這里插入圖片描述

此時我們就可以比較curA和curB是否相同,如果不相同,同時向后移動curA和curB,如果遇到curA == curB,則找到焦點。

否則循環(huán)退出返回空指針。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA=headA;
        ListNode* curB=headB;
        int lenA=0;
        int lenB=0;
        while(curA!=nullptr){  // 求鏈表A的長度
            lenA++;
            curA=curA->next;
        }
        while(curB!=nullptr){  // 求鏈表B的長度
            lenB++;
            curB=curB->next;
        }
        //現(xiàn)在的curA,curB已經(jīng)指向最后一個節(jié)點了,需要重新指向頭結(jié)點
        curA=headA;
        curB=headB; 
        if(lenA<lenB){  //假設(shè)鏈表A的長度大于鏈表B,否則交換
            swap(lenA,lenB);
            swap(curA,curB);
        }
        //gap是兩個鏈表長度的差值
        int gap=lenA-lenB; // gap=lenA-lenB 錯誤,要有返回類型
        while(gap){     // 讓curA和curB在同一起點上(末尾位置對齊)
            gap--;
            curA=curA->next;  
        }
        while(lenB){   // 遍歷curA 和 curB,遇到相同則直接返回
            if(curA==curB)
                return curA; // return curA(val) 返回節(jié)點中的值,這個寫法是錯誤的  直接return curA
            curA=curA->next;
            curB=curB->next;
            lenB--;
        } 
        return nullptr;  //沒有交點則返回空
    }
};

給你單鏈表的頭節(jié)點 head ,請你反轉(zhuǎn)鏈表,并返回反轉(zhuǎn)后的鏈表。

示例 1:

輸入:head = [1,2,3,4,5]

輸出:[5,4,3,2,1]

示例 2:

輸入:head = [1,2]

輸出:[2,1]

示例 3:

輸入:head = []

輸出:[]

雙指針?biāo)悸?/h3>

首先判斷鏈表是否為空,為空則返回nullptr。

接下來定義一個cur指針,指向頭結(jié)點,再定義一個pre指針,初始化為null。

然后就要開始反轉(zhuǎn)了,首先要把 cur->next 節(jié)點用tmp指針保存一下,也就是保存一下這個節(jié)點。

為什么要保存一下這個節(jié)點呢,因為接下來要改變 cur->next 的指向了,將cur->next 指向pre ,此時已經(jīng)反轉(zhuǎn)了第一個節(jié)點了。

接下來,就是循環(huán)走如下代碼邏輯了,繼續(xù)移動pre和cur指針。

最后,cur 指針已經(jīng)指向了null,循環(huán)結(jié)束,鏈表也反轉(zhuǎn)完畢了。 此時我們return pre指針就可以了,pre指針就指向了新的頭結(jié)點。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr)  //對空鏈表的判斷
            return nullptr;
        ListNode* per=nullptr;
        ListNode* cur=head;
        ListNode* temp; //建立一個指針
        while(cur){  //沒必要寫 while(cur!=nullptr),寫了這個還要判斷cur,會浪費(fèi)時間,直接cur就可以
            temp=cur->next; //保存cur的下一個節(jié)點
            cur->next=per; //cur的下一個節(jié)點指向per,實現(xiàn)反轉(zhuǎn)
            per=cur;  //cur=per;錯誤,是把cur的節(jié)點賦值給per
            cur=temp; //temp=cur;錯誤,是把temp(原來的cur->next)的節(jié)點賦值給cur
        }
        return per;
    }
};

遞歸

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverse(ListNode* per,ListNode* cur){  //返回的是一個鏈表,其返回值是指針
        if(cur==nullptr)  //遞歸的終止條件
            return per;
        ListNode* temp=cur->next;
        cur->next=per;
        return reverse(cur,temp); // 調(diào)用要寫return
    }
    ListNode* reverseList(ListNode* head) {
        if(head==nullptr) //鏈表判空
            return nullptr; 
        return reverse(NULL,head); // 調(diào)用要寫return
    }
};

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言深入淺出解析二叉樹

    C語言深入淺出解析二叉樹

    二叉樹可以簡單理解為對于一個節(jié)點來說,最多擁有一個上級節(jié)點,同時最多具備左右兩個下級節(jié)點的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)介紹一下C++中二叉樹的實現(xiàn)和遍歷,需要的可以參考一下
    2022-03-03
  • C++學(xué)習(xí)之異常機(jī)制詳解

    C++學(xué)習(xí)之異常機(jī)制詳解

    C++中的異常處理機(jī)制可以幫助我們處理程序在運(yùn)行時可能會遇到的異常情況,比如內(nèi)存分配錯誤、文件打開失敗等。本文就和大家詳細(xì)講講C++中異常機(jī)制的具體使用吧
    2023-04-04
  • C/C++計算程序執(zhí)行時間的幾種方法實現(xiàn)

    C/C++計算程序執(zhí)行時間的幾種方法實現(xiàn)

    本文主要介紹了C/C++計算程序執(zhí)行時間的幾種方法實現(xiàn),包括使用clock()函數(shù)、使用庫和使用time.h頭文件中的time()函數(shù),具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • C語言手寫多級時間輪定時器

    C語言手寫多級時間輪定時器

    這篇文章主要為大家詳細(xì)介紹了如何利用C語言實現(xiàn)手寫多級時間輪定時器,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下
    2022-09-09
  • 基于MFC實現(xiàn)自定義復(fù)選框效果

    基于MFC實現(xiàn)自定義復(fù)選框效果

    復(fù)選框是一種可同時選中多項的基礎(chǔ)控件,主要是有兩種明顯的狀態(tài):選中與非選中。本文將通過MFC框架實現(xiàn)自定義復(fù)選框效果,感興趣的可以了解一下
    2022-02-02
  • C++如何實現(xiàn)DNS域名解析

    C++如何實現(xiàn)DNS域名解析

    這片文章介紹了C++如何實現(xiàn)DNS域名解析,還有對相關(guān)技術(shù)的介紹,代碼很詳細(xì),需要的朋友可以參考下
    2015-07-07
  • C/C++中for語句循環(huán)用法以及練習(xí)舉例

    C/C++中for語句循環(huán)用法以及練習(xí)舉例

    for語句是一種循環(huán)語句,它是對while語句的推廣,下面這篇文章主要給大家介紹了關(guān)于C/C++中for語句循環(huán)用法以及練習(xí)舉例的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • C語言解決堆棧括號匹配問題示例詳解

    C語言解決堆棧括號匹配問題示例詳解

    這篇文章主要為大家介紹了C語言堆棧括號匹配問題示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • C語言自增(++)和自減(--)實例詳解

    C語言自增(++)和自減(--)實例詳解

    本篇文章主要介紹了C語言的自增和自減的基本知識,并附有代碼示例,以便大家理解,有需要的朋友可以看下
    2016-07-07
  • 深入理解C++中std::chrono庫的使用

    深入理解C++中std::chrono庫的使用

    在程序設(shè)計中,時間管理是一個核心概念,它不僅關(guān)系到程序的效率和性能,而且直接影響用戶體驗,C++作為一門高效的編程語言,提供了std::chrono庫,用于精確地處理和計算時間,下面就跟隨小編一起學(xué)習(xí)一下std::chrono庫的使用吧
    2023-12-12

最新評論

厦门市| 罗山县| 陇西县| 城市| 沐川县| 岱山县| 东乌| 明水县| 崇州市| 聂拉木县| 芦溪县| 肃宁县| 桦南县| 临朐县| 商城县| 新龙县| 治多县| 盐津县| 石渠县| 靖安县| 惠来县| 衡东县| 花垣县| 邵武市| 江北区| 榆林市| 福贡县| 泗洪县| 乌鲁木齐县| 隆昌县| 白山市| 留坝县| 上蔡县| 芷江| 江陵县| 台北县| 保靖县| 唐海县| 新晃| 安庆市| 衡东县|