给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
这道题我的第一思路是既然要依次翻转K个链表,我们可以选择按照题目直接要求依次翻转K个节点,将整个链表分为,已翻转部分,正在翻转部分,和未翻转部分如图
故算法的初步思路是将整个链表划分为K个部分依次处理:
1、首先建立一个头结点nhead方便对所有节点进行翻转操作
2、考虑到要分批次处理,要统计所有节点个个数Length
3、此时,我们可以循环处理只要带翻转的节点数大于K我们就要循环确定循环条件待翻转个数>K
4、翻转部分--经典的pre cur tail三指针法不过需要注意的是这里的第一个节点是不需要翻转的所有初始化时i=1
4、当当前k个节点全部翻转完之后,更新pre指针,tail指向就是上一个翻转完之后的尾指针,所以pre更新到tail位置即可,待翻转数量更新Length
5、相信到这里你已经基本理解了这道题的结题思路,快去在尝试一下吧!!加油!!!!
附:
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode*nhead=new ListNode(0);
int length=0;
nhead->next=head;
ListNode *pre=head;
while(pre){
length++;
pre=pre->next;
}
pre=nhead;
while(length>=k){
ListNode *tail=pre->next;//反转后的尾节点
ListNode *cur=tail->next;
for(int i=1;i<k;i++){
tail->next=cur->next;
cur->next=pre->next;
pre->next=cur;
cur=tail->next;
}
pre=tail;
length-=k;
}
return nhead->next;
}
};