给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
本题思路并不难得出,只是在实现上需要注意的细节较多。设置一个计数器n,以及p1,p2划分出当前区间,当n是k的倍数时反转该区间的链表(特别地,当n==k时将ans置为当前节点),设置一个temp为已排序链表的尾部,初始时为空,每次反转之前先将p2接在temp后,设置一个ne节点存储p2的下一个节点,然后反转区间内链表,将temp移到p1,将p1与p2都移动到ne。
当跳出循环时,若有剩余节点未反转(即n%k!=0),此时p1位于剩余节点头部,其尾部未反转处于置空状态,将p1接到p2之后并返回ans即可,若无剩余节点未反转,因为每次反转过程中都会将尾部置空,返回ans即可。
class Solution {
//用于反转从head到end之间的链表,并将尾节点后置空
public ListNode reverse(ListNode head,ListNode end){
if(head==null||head.next==null)
return head;
ListNode n1=head,n2=head.next,n3=n2.next;
while(n3!=null&&n2!=end){
n2.next=n1;
n1=n2;
n2=n3;
n3=n3.next;
}
n2.next=n1;
head.next=null;
return n2;
}
public ListNode reverseKGroup(ListNode head, int k) {
if(k==1)
return head;
ListNode dummyhead=new ListNode();
ListNode temp=dummyhead;
ListNode ans=null;
ListNode p2=head,p1=head;
int n=0;
while(p2!=null){
if(p2!=null)
n++;
if(n==k)
ans=p2;
if(n%k==0){
temp.next=p2;
ListNode ne=p2.next;
reverse(p1,p2);
temp=p1;
p2=ne;
p1=p2;
}else{
p2=p2.next;
}
}
if(n%k!=0)
temp.next=p1;
return ans;
}
}