反转链表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.更新方便: 动态链接使得库文件的更新变得更加方便。只需替换库文件,而不需要重新编译应用程序。所有使用该库的程序都能自动使用更新后的库。
总结:
静态链接的优势是无需外部依赖,运行时加载快,但文件较大且更新不方便。
动态链接的优势是可共享库文件,节省内存和磁盘空间,更新方便,但需要依赖外部库且可能影响程序启动速度。