力扣算法题-25.K个一组翻转链表 C语言实现

it2024-05-08  49

题目

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例: 给你这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5

说明: 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

思路

1、遍历链表,记录k个节点的起始节点,累计满k个节点,根据起始节点进行翻转即可; 2、最后记得连接剩余不满足k个节点的节点即可; 调试过程中遇到几次时间超限,但是看着代码又没有死循环,感觉自己眼神不好了,后来发现是链表没有连接好,链表有环了。

程序

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseKGroup(struct ListNode* head, int k){ int i = 0; struct ListNode* node = head; struct ListNode* pre = NULL; struct ListNode* sonnode = NULL; struct ListNode* sonhead = NULL; struct ListNode* sonpre = NULL; struct ListNode* sonnext = NULL; /*k值为1,直接返回原链表即可*/ if(k==1) return head; while(node){ i++; /*记录k个节点的起点*/ if(i==1){ sonhead = node; } node = node->next; /*满足k个链表后,将k个链表进行翻转*/ if(i==k){ /*翻转k链表*/ sonpre = NULL; sonnode = sonhead; while(i>0 && (sonnode != NULL)){ i--; sonnext = sonnode->next; sonnode->next = sonpre; sonpre = sonnode; sonnode = sonnext; } if(pre == NULL){ head=sonpre; }else{ pre->next = sonpre; } i=0; pre = sonhead; sonhead = NULL; } } /*链接后续不满k的链表*/ if(sonhead != NULL && pre != NULL){ pre->next = sonhead; } return head; }
最新回复(0)