LeetCode题目提醒收纳
第25. K 个一组翻转链表
本题还是用到链表,考察的是链表指针的变换;
这一题的特点就是根据题型设置了结构指针数组用以存储,十分方便!
不再用担心计算次数;
题目
K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
答题:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseKGroup(struct ListNode* head, int k){
struct ListNode* first=head;
struct ListNode num={0};
struct ListNode* haha=NULL;
struct ListNode** lists;//指针数组
lists=(struct ListNode**)calloc(k,sizeof(struct ListNode*));
num.next=head;
haha=#//这个还是比较新颖的。
int cnt=0;
while(1){
while(cnt<k&&first!=NULL){
lists[cnt]=first;
cnt++;
first=first->next;
}
if(cnt<k) break;//推出条件,我感觉不用加first!=NULL,再经历一次循环即可
while(cnt>0){
haha->next=lists[cnt-1];//注意这里的cnt-1,不要犯迷糊。
haha=haha->next;
cnt--;
}
haha->next=first;//这一点不是很懂,因为我认为再经历最后循环的时候,first指向了NULL而且break推出了循环。
//太机智了。。first是上一个循环的first,这一个循环的first与我无关。这个大法好!!!!
}
// for(int i=0;i<cnt;i++){
// haha->next=lists[i-1];
// haha=haha->next;
// }
free(lists);
return num.next;
这个题还好在没有新开辟一个链表逐个赋值,而是用原链表的内存进行明智的变换。强。