首页 > 其他分享 >链表操作2

链表操作2

时间:2024-12-13 16:57:15浏览次数:4  
标签:head ListNode cur nullptr fast next 链表 操作

[Algo] 链表操作2

1. 两个链表的交点

ListNode *intersectionNode(ListNode *head1, ListNode *head2)
{
    if (head1 == nullptr || head2 == nullptr) return nullptr;
    ListNode *cur1 = head1, *cur2 = head2;
    int len1 = 1, len2 = 1;
    while (cur1->next != nullptr)
    {
        cur1 = cur1->next;
        len1++;
    }
    while (cur2->next != nullptr)
    {
        cur2 = cur2->next;
        len2++;
    }
    if (cur1 != cur2) return nullptr;
    cur1 = len1 >= len2 ? head1 : head2;
    cur2 = len1 >= len2 ? head2 : head1;
    for (int i = 0; i < abs(len1 - len2); i++) cur1 = cur1->next;
    while (cur1 != cur2) 
    {
        cur1 = cur1->next;
        cur2 = cur2->next;
    }
    return cur1;
}

2. 链表按k个为一组逆序

// (1) 查找当前组的末尾节点
ListNode *teamEnd(ListNode *start, int k)
{
    if (start == nullptr) return nullptr;
    for (int i = 0; i < k - 1; i++)
    {
        if (start->next != nullptr) start = start->next;
        else return nullptr;
    }
    return start;
}
// (2) 链表局部逆序
void teamReverse(ListNode *start, ListNode *end)
{
    ListNode *cur = start->next, *pre = start, *post;
    start->next = end->next;
    while (pre != end)
    {
        post = cur->next;
        cur->next = pre;
        pre = cur;
        cur = post;
    }
}
// 2. 链表按组逆序
ListNode *reverseByGroup(ListNode *head, int k)
{
    ListNode *firstEnd = teamEnd(head, k);
    if (firstEnd == nullptr) return head;
    teamReverse(head, firstEnd);
    ListNode *lastStart = head;
    ListNode *curStart = lastStart->next;
    ListNode *curEnd = teamEnd(curStart, k);
    while (curEnd != nullptr)
    {
        teamReverse(curStart, curEnd);
        lastStart->next = curEnd;
        lastStart = curStart;
        curStart = curStart->next;
        curEnd = teamEnd(curStart, k);
    }
    return firstEnd;
}

3. 拷贝含有随机指针的链表

节点定义:

struct RListNode {
    int val;
    RListNode *next;
    RListNode *rand;
    RListNode(int x) : val(x), next(nullptr), rand(nullptr) {}
};
RListNode *copy(RListNode *head)
{
    if (head == nullptr) return nullptr;
    // 将新节点插入到老节点后面
    RListNode *cur = head;
    while (cur != nullptr)
    {
        RListNode *post = cur->next;
        cur->next = new RListNode(cur->val);
        cur->next->next = post;
        cur = post;
    }
    // 赋值rand指针
    cur = head;
    RListNode *cur_copy = cur->next;
    while (cur != nullptr)
    {
        cur_copy->rand = cur->rand == nullptr ? nullptr : cur->rand->next; // *
        cur = cur->next->next;
        if (cur_copy->next == nullptr) break;
        cur_copy = cur_copy->next->next;
    }
    // 将新老链表分离
    cur = head;
    cur_copy = cur->next;
    RListNode *ret = cur_copy;
    while (cur != nullptr)
    {
        RListNode *post = cur_copy->next;
        cur->next = post;
        if (post == nullptr) 
        { 
            cur_copy->next = nullptr;
            break;
        }
        cur_copy->next = post->next;
        cur = post;
        cur_copy = post->next;
    }
    return ret;
}

4. 判断回文链表

bool isPalindrome(ListNode *head)
{
    // 快慢指针————快指针一次跳2下,慢指针一次跳1下;当快指针无法继续时,慢指针指向链表重点。
    ListNode *slow = head, *fast = head;
    while (fast->next != nullptr && fast->next->next != nullptr)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    if (fast->next != nullptr) fast = fast->next;
    ListNode *fast_tmp = fast;
    teamReverse(slow, fast);
    while (head != nullptr)
    {
        if (head->val != fast->val) break;
        head = head->next;
        fast = fast->next;
    }
    teamReverse(fast_tmp, slow);
    return head == nullptr;
}

标签:head,ListNode,cur,nullptr,fast,next,链表,操作
From: https://www.cnblogs.com/yaoguyuan/p/18605291

相关文章

  • 52.Python操作MongoDB文档数据库
     (五十二)Python操作MongoDB文档数据库1:Pymongo详解  安装 pipinstallpymongo 查看数据库  frompymongoimportMongoClientconnect=MongoClient(host='localhost',port=27017,username="root",password="123456")connect......
  • 54.Python操作Redis缓存数据库
     (五十四)Python操作Redis缓存数据库 1:使用redis库操作Redis 安装 pipinstallredis string操作 示例1:单个stringimportredisclient=redis.StrictRedis(host='localhost',port=6379,db=0)result=client.set('robby',27)print(......
  • 55.Python操作SQLite数据库
      (五十五)Python操作SQLite数据库1:SQLite数据库 概念 SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中,与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中的嵌入式关系型数据库S......
  • C语言中的字符串操作函数
    此篇文章在2024年10月29日被记录盘点C语言中的字符串操作函数1、字符串复制和连接#include<stdio.h>#include<string.h>intmain(){//strcpycharsrc1[]="Hello";chardest1[20];strcpy(dest1,src1);printf("strcpy:%s\n",dest1);......
  • 【stablediffusion教程】的基础操作和使用技巧分享
    这是一篇关于stablediffusion本地部署并通过基础模型搭配不同的lora生成图片的教程,软件很容易获取,对电脑的要求也不是太高,相较于本地化的chatglm动不动就要6G显存的门槛还是很低的,根据不同性能显卡,同样的参数生成图片的速度也不一样,4090-24G版本的几秒就可以生成一张图,1060-......
  • 金蝶系统K3-预算管理操作
    金蝶预算管控操作步骤:1预算编制台:可以查看哪个预算模板是否在执行。双击进去可以查看里面的预算数2预算控制台:就是控制预算模板是否审核。审核状态就是在执行。不执行就反审对应预算模板即可。3预算预算执行明细:可以查看对应的预算管控规则里面的预算科目,哪些在执行都可......
  • 《安富莱嵌入式周报》第347期:分立元件自制14bit分辨率DAC,开源电池测试仪,大量位操作技
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版https://www.bilibili.com/video/BV1SFq9YAE4j/目录:1、分立元件自制14bit分辨率DAC2、开源电池测试仪3、微软为VSCode制作的AIToolkit插件4、Zephyr相关(1)好消......
  • 【数据结构与算法图解】学习笔记(第一章)①:分析数组操作过程中的时间复杂度
    文章目录前言一、第一章:数据结构为何重要1.概念(步数,时间复杂度)【第一个理论】:书中的第一个重要理论:操作的速度,并不按时间计算,而是按`步数`计算。2,了解数组2.1通过(读取,查找,插入,删除)来分析2.1.1读取(看任意索引上的值)2.1.2查找(看数组/列表中有没有该值)2.1.3插入(往......
  • 22. 如何让 SAP Fiori Elements List Report 启动后自动点击 Go 按钮触发数据读取操作
    有学习者咨询笔者,FioriElementsListReport应用,使用本教程例子的配套代码,运行命令行npmrunstart启动之后,总是显示的一个空空的SmartTable,如下图所示:需要用户手动点击Go按钮,然后才能看到数据:这种操作有点麻烦。能不能在应用启动之后,就自动触发读取数据的操作......
  • 开源低代码平台-Microi吾码-接口引擎实战:MongoDB相关操作
    Microi吾码-接口引擎实战:MongoDB相关操作前言往MongoDB系统日志中插入数据新增数据(自定义数据库名、表名)修改数据删除数据查询数据列表查询单条数据Microi吾码-系列文档接口引擎实战-系列文档前言本篇介绍如何在接口引擎、后端V8事件中对MongoDB进行相关操作对Mongo......