题目链接:K个一组反转链表
题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
题目分析:在单链表反转的基础上,每K个进行反转,关键是每次反转后的部分的头尾进行一次重新调整
代码:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
int len = 0;
ListNode temp = head;
while(temp!=null){
len++;
temp = temp.next;
}
int cnt = len/k;//反转次数
//伪头节点
ListNode newHead = new ListNode(-1);
newHead.next = null;
ListNode p = head,pre,next;
//保存每次反转的链表部分反转之前的头节点,和下一次反转的链表进行一个连接
//比如,[1,2,3,4,5,6,7] k = 3
//反转1,2,3时,prehead保存1
//那么4,5,6反转好后,将1->next指向此时的6
//即将反转后链表的串起来
ListNode[] prehead = new ListNode[cnt];
for (int i = 0; i < cnt; i++) {
prehead[i] = p;
int c = 0;
pre = null;
//与单链表反转过程一致
while(c++<k){
next = p.next;
p.next = pre;
pre = p;
p = next;
}
if(i==0) {
newHead.next = pre;//和头节点进行连接
}else{
prehead[i-1].next = pre;//与之前的链表连接
}
}
//连接反转后剩余的部分
if(p!=null) prehead[cnt-1].next = p;
return newHead.next;
}
}