【数据结构初阶】单链表经典算法题十道(详解+图例)—得道飞升(终篇)

hi !

目录

[9、 环形链表 ||](#9、 环形链表 ||)

10、随机链表的复制

终章


9、 环形链表 ||

【图解】

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
    //找相遇节点
    ListNode* slow=head;
    ListNode* fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            //相遇,开始遍历
            ListNode* pcur=head;
            while(slow!=pcur)
            {
                slow=slow->next;
                pcur=pcur->next;
            }
            return slow;
        }
    }
    return NULL;
    
}

10、随机链表的复制

【图解】

【思路】

1、在原链表的基础上复制新链表

2、置random指针

3、(改变next指针指向)将复制链表和原链表断开

cs 复制代码
/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

typedef struct Node Node;
//创建新结点
Node* BuyNode(int x)
{
    Node* newnode=(Node*)malloc(sizeof(Node));
    newnode->val=x;
    newnode->next=newnode->random=NULL;

    return newnode;
}
//复制结点
void AddNode(Node* phead)
{
    Node* pcur=phead;
    while(pcur)
    {
        Node* Next=pcur->next;
        //创建新结点
        Node* newnode=BuyNode(pcur->val);
        newnode->next=Next;
        pcur->next=newnode;

        pcur=Next;
    }
}

struct Node* copyRandomList(struct Node* head) {
    if(head==NULL)
    {
        return NULL;
    }
    //第一步:复制结点
    AddNode(head);

    //第二步:置random
    Node* pcur=head;
    while(pcur)
    {
        Node* copy=pcur->next;
        if(pcur->random!=NULL)
        {
            copy->random=pcur->random->next;
        }
        pcur=copy->next;
    }

    //第三步:断开链表
    pcur=head;
    Node* newTail,*newHead;
    newTail=newHead=pcur->next;
    while(pcur->next->next)
    {
        pcur=pcur->next->next;
        newTail->next=pcur->next;
        newTail=newTail->next;
    }
    return newHead;
}

这十道题做完理解透,想不提升都难


完------

------------------------------------------------ 终章 ------------------------------------------------

Lemon_米津玄師_高音质在线试听_Lemon歌词|歌曲下载_酷狗音乐酷狗音乐为您提供由米津玄師演唱的高清音质无损Lemonmp3在线听,听Lemon,只来酷狗音乐!https://t3.kugou.com/song.html?id=cp8Rz2eCPV2

拜拜------

相关推荐
quantdash_cc4 小时前
Pandas 处理分钟级股票行情:从原始数据清洗到 K 线聚合
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
yu_zhidun4 小时前
企业电脑监控软件怎么选:别只看功能清单,先看这 6 个底层能力
开发语言·电脑·php·域智盾系统
丑梨数据4 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
烂蜻蜓4 小时前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
无忧.芙桃5 小时前
C++语言原理与实践(十六):多态机制讲解
开发语言·c++·多态
优选资源分享5 小时前
PicGo v3.0.3 新版 | 开源免费图床工具
javascript·笔记·electron
李纲明5 小时前
WordPress 白屏排查手册:关插件、换主题、开调试、查 PHP(附停手信号)
开发语言·php·wordpress·故障排查·白屏·插件冲突
ShineWinsu5 小时前
对于JavaScript:JavaScript基础语法的解析
开发语言·前端·javascript·面试·web·基础语法·循环
erzong2316 小时前
Linux操作系统:线程概念与控制
linux·算法
星恒随风6 小时前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式