今天的题目也不难,就基本的贪心硬贪就好了。希望有想要提高的同学跟我们一起来刷题0.0
4.4日每日一题——反转链表II
🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 20min
全文目录
☘前言☘
解题思路
📑写在最后
92. 反转链表 II
解题思路
先找到反转的起点的前一个结点和起点节点,其中前一个节点是为了头插,第一个节点就是反转之后的最后一个节点,进行记录,后面使用头插法进行反转,最终将最后的一个节点和后面的节点连起来就行了。
是不是完全没听懂????哈哈哈 看图
链表文字是很难表述清楚的,所以常画图吧。
今天写的代码
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++的东西,正好算法刷题也要用到,希望大家和我一起加油呀。