2023级毕业生,求职不易,愿大家都有一个更好的明天。
接下来我会分享我在leetcode做的一些有趣的题,欢迎大家交流!
- 反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1
输出:[5]
解答:
/**
* 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) {
ListNode* pre = new ListNode(0);
pre->next = head;
head = pre;
for(int i = 1; i < left; i++){
pre = pre->next;
}
ListNode* cur = pre->next;
for(int i = left; i < right; i++){
ListNode* next = cur->next;
cur->next = next->next;
next->next = pre->next;
pre->next = next;
}
pre = head;
head = head->next;
delete(pre);
return head;
}
};
- 剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
解法1:
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//第一种翻转
ListNode* pre = NULL;
ListNode* cur = head;
while(cur){
ListNode* nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
}
return pre;
}
};
解法2:
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//第二种翻转
ListNode* pre = new ListNode(0);
ListNode* cur = head;
pre->next = head;
ListNode* nex = head;
while(cur && cur->next){
nex = cur->next;
cur->next = nex->next;
nex->next = pre->next;
pre->next = nex;
}
delete(pre);
return nex;
}
};