反转链表2-92
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {//如果left=1的情况下会用到虚头节点,以便进行反转ListNode* Head = new ListNode();Head->next = head;//左指针首先指向虚头节点,然后for循环走到将要反转的链表(子链表)的前一个结点ListNode* LeftPointer = Head;for(int i=0;i<left-1;i++){LeftPointer = LeftPointer->next;//}//右指针首先指向虚头节点,然后for循环走到将要反转的链表(子链表)的最后个节点ListNode* RightPointer = Head;for(int i=0;i<right;i++){RightPointer = RightPointer->next;}//切断出一个子链表ListNode* ChildListHead = LeftPointer->next;ListNode* ChildListNextCurr = RightPointer->next;//反转子链表ListNode* cur = NULL;ListNode* pre = ChildListHead;while(pre!=ChildListNextCurr){ListNode* t = pre->next;pre->next = cur;cur = pre;pre = t;}//将反转后的子链表拼接到原来切断的位置LeftPointer->next = cur;ChildListHead->next = ChildListNextCurr;return Head->next;}
};
每日问题
静态链接的特点是什么? 动态链接的特点是什么?
静态链接和动态链接是两种不同的程序链接方式,具有各自的特点。
静态链接的特点:
1.链接时机: 静态链接发生在编译期间,程序的所有外部依赖(如库函数)会在编译时被直接嵌入到生成的可执行文件中。
2.生成的可执行文件: 静态链接生成的可执行文件包含了所有的代码和数据,所有依赖的库文件也都被复制到程序中,因此程序不再依赖外部的库文件。
3.执行效率: 因为所有代码都已经在编译时链接好,所以程序运行时不需要再进行符号解析或加载外部库,执行效率较高。
4.可移植性: 静态链接生成的可执行文件可以在没有目标库的环境中运行,因为它已经将所有依赖打包在一起。
5.文件大小: 由于所有库函数都被包含在内,静态链接的可执行文件通常较大。
6.更新困难: 如果库函数或库文件有更新,程序需要重新编译和链接,才能包含新的库版本。
动态链接的特点:
1.链接时机: 动态链接是在程序运行时进行的。可执行文件中只包含对外部库的引用,而不直接嵌入库的实现代码。
2.依赖外部库: 程序在运行时需要加载动态链接库(DLL 或共享库 .so 文件)。这些库文件可以在程序运行时由操作系统加载和链接。
3.执行效率: 程序启动时需要加载动态库,可能会稍微影响启动速度,但运行过程中会节省内存空间,因为多个程序可以共享同一份库文件。
4.可移植性: 动态链接的程序依赖于外部库文件,如果目标系统缺少所需的库,程序将无法正常运行。
5.文件大小: 动态链接的可执行文件通常较小,因为它不包含库的代码,只保存对库的引用。
6.更新方便: 动态链接使得库文件的更新变得更加方便。只需替换库文件,而不需要重新编译应用程序。所有使用该库的程序都能自动使用更新后的库。
总结:
静态链接的优势是无需外部依赖,运行时加载快,但文件较大且更新不方便。
动态链接的优势是可共享库文件,节省内存和磁盘空间,更新方便,但需要依赖外部库且可能影响程序启动速度。