题目地址:25. K 个一组翻转链表 - 力扣(LeetCode) (leetcode-cn.com)
题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
解题思路:
每k个为一组进行翻转;
注意每组头节点的前一个节点以及尾节点的后一个节点(确保每组连接正确,第一组需要考虑整个链表的头节点位置);
翻转使用常数额外空间(O(k));
class Solution {
public:
ListNode* my_reserve(ListNode *head,int k){
ListNode *p1 = head,*before = NULL;
while(k--){
ListNode *temp = p1->next;
p1->next = before;
before = p1;
p1 = temp;
}
return before;
}
ListNode* reverseKGroup(ListNode* head, int k) {
if(k==1){return head;}
ListNode *p1 = head,*p2 = head,*p3 = head,*temp = NULL;
int count = 1;
while(p1 != NULL){
if(count % k != 0){
count++;
p1 = p1->next;
continue;
}
p1 = p1->next;
count = 1;
if(p3 == head){head = my_reserve(p2,k);}
else{temp->next = my_reserve(p2,k);}
temp = p2;
p2 = p1;
}
temp->next = p2;
return head;
}
};
标准答案:
模拟;思路大致一样,在翻转是使用pair传入初始的头节点和尾节点同时返回每组子链表的头节点和尾节点。