目录
1.反转链表
92. 反转链表 II - 力扣(LeetCode)
https://leetcode.cn/problems/reverse-linked-list-ii/description/
cpp
/**
* 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* successor = nullptr;
ListNode* reverseN(ListNode* head, int n) {
if (n == 1) {
successor = head->next;
return head;
}
ListNode* last = reverseN(head->next, n - 1);
head->next->next = head;
head->next = successor;
return last;
}
ListNode* reverseBetween(ListNode* head, int left, int right) {
if (left == 1) {
return reverseN(head, right);
}
head->next = reverseBetween(head->next, left - 1, right - 1);
return head;
}
};
a.核心思想
利用递归或迭代的方法,找到需要反转的链表部分的起始节点和结束节点,进行局部反转,并重新连接链表的前后部分。
b.思路
可以采用递归的方法,先递归到需要反转的结束节点的下一个位置,然后从后往前进行节点的反转操作,同时维护好前后链表的连接。
c.步骤
① 如果
left等于1,相当于从链表头部开始反转,直接调用反转整个链表的递归函数(反转前right - left + 1个节点)。② 一般情况下,先递归到
left - 1位置,记录其下一个节点为需要反转部分的头节点。③ 继续递归到
right位置,进行局部反转操作,将反转后的链表头节点连接到left - 1位置的节点后面。④ 返回原链表的头节点。
2.传值和传地址区别,内容会有什么不一样
a.传值
传递内容:传递的是实参值的副本。函数内部获得的是与实参值相同但独立的新值。
影响:在函数中对参数的修改不会影响到实参本身。例如,将一个整数传值给函数,函数内对该整数的修改不会改变函数外原变量的值。
b.传地址
传递内容:传递的是实参的地址(指针方式)或对实参的引用(引用方式)。函数内部通过地址或引用直接操作实参所指向的内存。
影响:在函数中对参数的修改会直接影响到实参。比如传递一个指针指向的整数,函数内对该整数内存的修改会反映到函数外原变量上。
简而言之,传值是传数据副本,函数内修改不影响原数据;传地址是传数据位置,函数内修改会影响原数据。
希望这些内容对大家有所帮助!
感谢大家的三连支持!