☘前言☘
今天的题目也不难,就基本的贪心硬贪就好了。希望有想要提高的同学跟我们一起来刷题0.0
4.4日每日一题——反转链表II
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 20min
解题思路
先找到反转的起点的前一个结点和起点节点,其中前一个节点是为了头插,第一个节点就是反转之后的最后一个节点,进行记录,后面使用头插法进行反转,最终将最后的一个节点和后面的节点连起来就行了。
是不是完全没听懂????
哈哈哈 看图
链表文字是很难表述清楚的,所以常画图吧。
今天写的代码
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
struct ListNode nohead;//头节点 统一left为0的情况
nohead.next = head;
struct ListNode*prev = &nohead;
while(--left) --right,head=head->next,prev = prev->next;
struct ListNode *nextlist, *end = head; //记录临时结点
while(right--){
nextlist = head->next;
head->next = prev->next;
prev->next = head; //头插法
head=nextlist;
}
end->next = nextlist;
return nohead.next;
}
加入头节点是经常用的方式,大家一定要学会使用。
五个月前的代码
struct ListNode * fanzhuan(struct ListNode *head){
struct ListNode *p = head,*prev = NULL;
while(p){
head = p->next;
p->next = prev;
prev = p;
p = head;
}
return prev;
}
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
if(!head||!head->next) return head;
int i =0;
struct ListNode *prehead = (struct ListNode *)malloc(sizeof(struct ListNode)),*p = prehead,*prev,*hou,*temp;
prehead->next = head;
for(;i<left-1;i++) p = p->next;
prev = p;
for(;i<right;++i) p = p->next;
hou = p->next;
p->next = NULL;
temp = prev->next;
p = fanzhuan(prev->next);
prev->next =p;
temp->next = hou;
return prehead->next;
}
其实感觉五个月前的代码更清晰,就是处理反转子串,然后连回来就好了,但是其实代码量有点大。大家自己取舍吧。
📑写在最后
今天就先这样,本来昨天打算开底层学习的,好家伙,上来就是开发板,完了一块垃圾版3000+,买不起,决定先跳过一部分内容,今天开始学习C++的东西,正好算法刷题也要用到,希望大家和我一起加油呀。