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

C語言刷題判斷鏈表中是否有環(huán)題解

 更新時(shí)間:2023年07月26日 10:42:38   作者:吳尼瑪  
這篇文章主要為大家介紹了C語言刷題判斷鏈表中是否有環(huán)題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題目

判斷給定的鏈表中是否有環(huán)。如果有環(huán)則返回true,否則返回false。

數(shù)據(jù)范圍:鏈表長(zhǎng)度 0≤n≤10000,鏈表中任意節(jié)點(diǎn)的值滿足 ∣val∣<=100000
要求:空間復(fù)雜度 O(1),時(shí)間復(fù)雜度 O(n)

輸入分為兩部分,第一部分為鏈表,第二部分代表是否有環(huán),然后將組成的head頭結(jié)點(diǎn)傳入到函數(shù)里面。-1代表無環(huán),其它的數(shù)字代表有環(huán),這些參數(shù)解釋僅僅是為了方便讀者自測(cè)調(diào)試。實(shí)際在編程時(shí)讀入的是鏈表的頭節(jié)點(diǎn)。

例如輸入{3,2,0,-4},1時(shí),對(duì)應(yīng)的鏈表結(jié)構(gòu)如下圖所示:

可以看出環(huán)的入口結(jié)點(diǎn)為從頭結(jié)點(diǎn)開始的第1個(gè)結(jié)點(diǎn)(注:頭結(jié)點(diǎn)為第0個(gè)結(jié)點(diǎn)),所以輸出true。

示例1

輸入:
{3,2,0,-4},1
返回值:
true
說明:
第一部分{3,2,0,-4}代表一個(gè)鏈表,第二部分的1表示,-4到位置1(注:頭結(jié)點(diǎn)為位置0),即-4->2存在一個(gè)鏈接,組成傳入的head為一個(gè)帶環(huán)的鏈表,返回true

示例2

輸入:
{1},-1
返回值:
false
說明:
第一部分{1}代表一個(gè)鏈表,-1代表無環(huán),組成傳入head為一個(gè)無環(huán)的單鏈表,返回false

示例3

輸入:
{-1,-7,7,-4,19,6,-9,-5,-2,-5},6
返回值:
true

思路1

使用兩個(gè)指針,fast 與 slow。
它們起始都位于鏈表的頭部。隨后,slow 指針每次向后移動(dòng)一個(gè)位置,而fast 指針向后移動(dòng)兩個(gè)位置。如果鏈表中存在環(huán),則 fast 指針最終將再次與 slow 指針在環(huán)中相遇。

知識(shí)點(diǎn):雙指針

雙指針指的是在遍歷對(duì)象的過程中,不是普通的使用單個(gè)指針進(jìn)行訪問,而是使用兩個(gè)指針(特殊情況甚至可以多個(gè)),兩個(gè)指針或是同方向訪問兩個(gè)鏈表、或是同方向訪問一個(gè)鏈表(快慢指針)、或是相反方向掃描(對(duì)撞指針),從而達(dá)到我們需要的目的。

解答代碼1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr) {
            return false;
        }
        // 定義快慢指針
        auto slow = head;
        auto fast = head;
        // 循環(huán)退出條件為快指針先到鏈表尾部
        while (fast != nullptr && fast->next != nullptr) {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) {
                // 快慢指針相遇表示有環(huán)
                return true;
            }
        }
        return false;
    }
};

思路2

遍歷鏈表中的每個(gè)節(jié)點(diǎn),并將它記錄下來;一旦遇到了此前遍歷過的節(jié)點(diǎn),就可以判定鏈表中存在環(huán),需借助哈希表(C++中std::unordered_set)。

但這種解法的空間復(fù)雜度為O(N),其中 N 為鏈表中節(jié)點(diǎn)的數(shù)目。因?yàn)樾枰獙㈡湵碇械拿總€(gè)節(jié)點(diǎn)都保存在哈希表當(dāng)中。

解答代碼2

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include <unordered_set>
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr) {
            return false;
        }
        auto cur = head;
        std::unordered_set<ListNode *> sets;
        while (cur != nullptr) {
            if (sets.find(cur) != sets.end()) {
                // 在unordered_set中找到了,表示有環(huán)
                return true;
            } else
                sets.emplace(cur);
            cur = cur->next;
        }

以上就是C語言刷題判斷鏈表中是否有環(huán)題解的詳細(xì)內(nèi)容,更多關(guān)于C語言判斷鏈表是否有環(huán)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++使用yaml-cpp庫操作YAML的示例代碼

    C++使用yaml-cpp庫操作YAML的示例代碼

    配置文件有利于我們靈活配置工程,解決大量重復(fù)勞動(dòng),也方便調(diào)試,YAML?是一種人類可讀的數(shù)據(jù)序列化格式,它使用縮進(jìn)和特定的符號(hào)來表示數(shù)據(jù)結(jié)構(gòu),在本文中,我們將詳細(xì)介紹如何在?C++?中使用?yaml-cpp?庫來解析和生成?YAML?格式的數(shù)據(jù),需要的朋友可以參考下
    2024-10-10
  • 淺析C語言中的內(nèi)存布局

    淺析C語言中的內(nèi)存布局

    以下是對(duì)C語言中的內(nèi)存布局進(jìn)行了詳細(xì)的分析介紹。需要的朋友可以過來參考下
    2013-08-08
  • C++實(shí)現(xiàn)紅黑樹核心插入實(shí)例代碼

    C++實(shí)現(xiàn)紅黑樹核心插入實(shí)例代碼

    紅黑樹是一種二叉搜索樹,但在每個(gè)結(jié)點(diǎn)上增加一個(gè)存儲(chǔ)位表示結(jié)點(diǎn)的顏色,可以是Red或Black,下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)紅黑樹核心插入的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • socket編程之bind()函數(shù)使用示例詳解

    socket編程之bind()函數(shù)使用示例詳解

    這篇文章主要為大家介紹了socket編程之bind()函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • C++動(dòng)態(tài)內(nèi)存分配(new/new[]和delete/delete[])詳解

    C++動(dòng)態(tài)內(nèi)存分配(new/new[]和delete/delete[])詳解

    這篇文章主要介紹了C++動(dòng)態(tài)內(nèi)存分配(new/new[]和delete/delete[])詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++多繼承(多重繼承)的實(shí)現(xiàn)

    C++多繼承(多重繼承)的實(shí)現(xiàn)

    多繼承容易讓代碼邏輯復(fù)雜、思路混亂,本文主要介紹了C++多繼承(多重繼承)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解

    C語言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解

    這篇文章主要介紹了C語言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解,包括sigismember函數(shù)和sigfillset函數(shù)以及sigemptyset函數(shù)的用法,需要的朋友可以參考下
    2015-09-09
  • C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息

    C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息

    這篇文章主要介紹了C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • 解決Qt設(shè)置QTextEdit行高的問題

    解決Qt設(shè)置QTextEdit行高的問題

    這篇文章介紹了Qt設(shè)置QTextEdit行高的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C語言中變參函數(shù)傳參的實(shí)現(xiàn)示例

    C語言中變參函數(shù)傳參的實(shí)現(xiàn)示例

    本文主要介紹了C語言中變參函數(shù)傳參,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論

肥东县| 靖宇县| 沙河市| 西盟| 云安县| 侯马市| 济南市| 中方县| 栾城县| 武城县| 宽甸| 壶关县| 兰西县| 厦门市| 亳州市| 全州县| 秭归县| 五华县| 贵港市| 岳阳市| 松桃| 临泽县| 延安市| 巴彦县| 龙泉市| 宁德市| 册亨县| 旌德县| 辽阳县| 五大连池市| 桂林市| 新密市| 买车| 马山县| 云霄县| 田阳县| 霍州市| 甘洛县| 汝城县| 平遥县| 曲水县|