当前位置: 首页 > news >正文

随想录一刷Day04——链表

文章目录

  • Day04_链表
    • 5. 两两交换链表中的节点
    • 6. 删除链表的倒数第 N 个结点
    • 7. 链表相交
    • 8. 环形链表 II

Day04_链表

5. 两两交换链表中的节点

24. 两两交换链表中的节点
思路:

按照下如图模拟
在这里插入图片描述

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* _dummyHead = new ListNode(0);
        _dummyHead->next = head;
        ListNode* cur = _dummyHead;
        while (cur->next && cur->next->next) {
            ListNode* tmp = cur->next; // 记录节点1
            ListNode* tmp_next_pair = cur->next->next->next; // 记录下一对节点的起点
            cur->next = cur->next->next; // 步骤一
            cur->next->next = tmp; // 步骤二
            tmp->next = tmp_next_pair; // 步骤三
            cur = cur->next->next; // 虚拟节点移动到下对节点的正确位置
        }
        return _dummyHead->next;
    }
};

6. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点
思路:

本来想两次遍历,看到卡哥的双指针,直呼挺妙,虽然复杂度也是 O ( n ) O(n) O(n)
利用双指针间格n个位置,就可以在fast指针移动到链表结尾时,slow指针停在要删除的节点前。

在这里插入图片描述

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* _dummyHead = new ListNode(0);
        _dummyHead->next = head;
        ListNode* fast_index = _dummyHead;
        ListNode* slow_index = _dummyHead;
        while(n-- && fast_index) {
            fast_index = fast_index->next;
        }
        while(fast_index->next) {
            fast_index = fast_index->next;
            slow_index = slow_index->next;
        }
        slow_index->next = slow_index->next->next;
        return _dummyHead->next;
    }
};

7. 链表相交

面试题 02.07. 链表相交
思路:

又不是自己想的,呜呜呜
显然不能是利用两个节点的值相等作为判断依据,要判断指针地址一致才行。如何让两个节点能够在相交处相遇呢?就让两个链表从头部对齐变为尾部对齐,接下来一起以相同的速度往后遍历,一定会在相交的点处相遇。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* A_pos = headA;
        ListNode* B_pos = headB;
        int lenA = 0, lenB = 0;
        while(A_pos) { // 获取A链表的长度
            lenA++;
            A_pos = A_pos->next;
        }
        while(B_pos) { // 获取B链表的长度
            lenB++;
            B_pos = B_pos->next;
        }

        int delta_len = lenA - lenB; // 默认链表A长
        A_pos = headA;
        B_pos = headB;
        if (delta_len < 0) { // 调整为A链表为长链表
            swap(lenA, lenB);
            swap(A_pos, B_pos);
            delta_len = abs(delta_len);
        }
        
        while(delta_len--) { // 将A、B链表尾部对齐
            A_pos = A_pos->next;
        }

        while (A_pos && A_pos != B_pos) { // 同时遍历A、B链表,找到相交节点
            A_pos = A_pos->next;
            B_pos = B_pos->next;
        }

        return A_pos;
    }
};

8. 环形链表 II

142. 环形链表 II
思路:

实用两个指针,一快一慢,快指针一次走两步,慢指针一次走一步。如果两个指针相交,则有环。然后快指针在交点处,慢指针在起点处,以步长为1运动,直到相遇点,为环的交点。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast_index = head;
        ListNode* slow_index = head;
        while(fast_index && slow_index) {
            fast_index = fast_index->next;
            slow_index = slow_index->next;
            if (fast_index == NULL || slow_index == NULL) return NULL;
            fast_index = fast_index->next;
            if (fast_index == slow_index) break;
        }
        if (fast_index == NULL || slow_index ==NULL) return NULL;
        // cout << "here" << endl;
        slow_index = head;
        while (fast_index != slow_index) {
            fast_index = fast_index->next;
            slow_index = slow_index->next;
        }
        return fast_index;
    }
};

相关文章:

  • 【javaweb简单教程】2.JSP实现数据传递和保存(含四大作用域及简单示例)
  • 7.ROS2笔记-节点
  • 【C++】类和对象(下篇)(万字)
  • 【牛客 - 剑指offer】JZ67 把字符串转换成整数 Java实现
  • python采集火热弹幕数据并做词云图可视化分析
  • 【小程序从0到1】模版与配置|数据绑定|事件绑定
  • NetSuite SuiteQL Query Tool
  • 功能异常强大,推荐这款 Python 时序异常检测神器
  • 串的存储结构 --王道
  • React路由规则的定义、声明式导航、编程式导航
  • Java_四种内部类
  • Java lang包简介说明
  • 推荐一款替代Navicat的MySQL数据库管理工具-HeidSQL
  • R语言使用lm函数构建分层线性回归模型(添加分组变量构建分层线性回归模型)、使用summary函数获取分层线性回归模型汇总统计信息
  • Maven坐标查找方法及Maven-Search 插件的使用(保姆级教学)
  • ----------
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • C语言笔记(第一章:C语言编程)
  • iOS 系统授权开发
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java程序员幽默爆笑锦集
  • MySQL数据库运维之数据恢复
  • SpringCloud集成分布式事务LCN (一)
  • Webpack 4 学习01(基础配置)
  • 百度地图API标注+时间轴组件
  • 闭包--闭包之tab栏切换(四)
  • 多线程 start 和 run 方法到底有什么区别?
  • 关于extract.autodesk.io的一些说明
  • 前端面试总结(at, md)
  • 如何利用MongoDB打造TOP榜小程序
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 设计模式 开闭原则
  • raise 与 raise ... from 的区别
  • 数据库巡检项
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​第20课 在Android Native开发中加入新的C++类
  • #pragma pack(1)
  • #QT(串口助手-界面)
  • #WEB前端(HTML属性)
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)基于IDEA的JAVA基础1
  • (转) Android中ViewStub组件使用
  • (转)Scala的“=”符号简介
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)详解PHP处理密码的几种方式
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .gitignore文件---让git自动忽略指定文件
  • .NET : 在VS2008中计算代码度量值
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Core中Emit的使用