反转链表||&动静态链接

反转链表 II

第一种方法:使用数组顺序记录区间内节点的地址,然后双指针双向向内遍历节点地址,逐步交换节点存储数值。时间复杂度为on、空间复杂度为on

cpp 复制代码
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode *pi = head;
        int n = 0;
        vector<ListNode*> lis;
        while(head)
        {
            n++;
            if(n>=left&&n<=right)
            {
                lis.emplace_back(head);
            }
            head = head->next;
        }
        int i = 0,j = lis.size()-1;
        while(i<j)
        {
            swap(lis[i++]->val,lis[j--]->val);
        }
        return pi;
    }
};

第二种方法:记录反转开始节点的前驱节点方便连接反转后的pre位置(结论:反转链表完成后cur处于空位,也就是反转后pre会处于right位置,可以直接使用反转开始处的前驱节点连接pre)那么pre处于right,cur处于right+1,记录反转开始处的节点用于连接cur位置,反转结束,如果left为1,也就是说是从头翻转的,那反转开始处的前驱节点为空,所以当这种情况时直接把pre设置为head,最后返回head。

cpp 复制代码
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        // 边界情况检查
        if (!head || left == right) return head;

        ListNode *pre = nullptr, *cur = head;
        // 定位到 left 节点及其前驱节点
        for (int i = 1; cur && i < left; i++) {
            pre = cur;
            cur = cur->next;
        }

        // 保存反转部分的前驱节点
        ListNode *preLeft = pre, *postRight = cur;

        // 反转 [left, right] 区间的节点
        ListNode *prev = nullptr;
        for (int i = left; cur && i <= right; i++) {
            ListNode *next = cur->next;
            cur->next = prev;
            prev = cur;
            cur = next;
        }

        // 连接反转后的部分
        if (preLeft) {
            preLeft->next = prev;
        } else {
            // 如果 left 是 1,说明反转的是头部部分
            head = prev;
        }
        postRight->next = cur;

        return head;
    }
};

静态链接的特点是什么?

静态链接:

静态链接是程序和所有代码和代码所依赖的库直接链接到可执行文件的过程,在程序编译时,所有需要的库文件和目标文件都会在编译过程中合并。

特点:执行时不依赖外部库、可执行文件较大、运行时效率高、因为是静态的所以无法共享库的更新、可移植性好、编译时间较长。

动态链接的特点是什么?

动态链接:

动态链接是指在程序运行时,将程序所依赖的库文件(如 .dll.so 文件)动态加载到内存中。这意味着程序在编译时并不包含所有库代码,而是依赖外部的共享库。

特点:运行时加载、较小的可执行文件、节省内存、支持共享库更新、动态加载库文件需要额外开销、依赖外部库(如果缺少必要的库文件程序无法运行)

相关推荐
LuminousCPP12 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
AI算法沐枫13 小时前
深度学习python代码处理科研测序数据
数据结构·人工智能·python·深度学习·决策树·机器学习·线性回归
m0_6294947314 小时前
LeetCode 热题 100-----26.环形链表 II
数据结构·算法·leetcode·链表
壹号用户15 小时前
用队列实现栈
数据结构·算法
欧米欧16 小时前
C++进阶数据结构之搜索二叉树
开发语言·数据结构·c++
小江的记录本16 小时前
【Java基础】反射与注解:核心原理、自定义注解、注解解析方式(附《思维导图》+《面试高频考点清单》)
java·数据结构·python·mysql·spring·面试·maven
Trouvaille ~17 小时前
【Redis篇】初识 Redis:特性、应用场景与版本演进
数据结构·数据库·redis·分布式·缓存·中间件·持久化
向日的葵00619 小时前
从IO视角深度对比:BST、红黑树、B树、B+树
数据结构·b树
小羊在睡觉19 小时前
力扣239. 滑动窗口最大值
数据结构·后端·算法·leetcode·go
我星期八休息20 小时前
Linux系统编程—库制作与原理
linux·运维·服务器·数据结构·人工智能·python·散列表