题目概述
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
例:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
代码讲解
class Solution {
//head为头节点,k是我们要反转的范围
public ListNode reverseKGroup(ListNode head, int k) {
//新建哨兵节点,指向head,目的是作为返回的头节点
ListNode dummyHead=new ListNode(-1);
dummyHead.next=head;
//需要反转的前一个节点
ListNode pre=dummyHead;
//begin,end代表反转的第一个节点和最后一个节点
ListNode begin=dummyHead;
ListNode end=dummyHead;
//因为end是作为快指针使用的,在while循环里end用完后每次都会进行初始化end=pre,即end.next==null代表遍历完成返回即可。
while (end.next!=null){
// 寻找end的位置,如果寻找期间end==null说明 我剩下的链表长度<k 所以根据题意直接返回不需反转
for (int i=0;i<k&&end!=null;i++){
end=end.next;
}
if (end==null){
break;
}
//进行到该步骤代表end位置已经初始化完成,下面开始初始化begin节点
begin=pre.next;
//我们要寻找end.next,因为我们在进行链表反转时需要把end.next设置为null 否则反转时该程序不知道我们反转的最后位置,
ListNode next=end.next;
end.next=null;
//因为我们进行了反转, 原本end的位置变成第一位 下面代码代表pre节点与反转后的进行连接
pre.next=swap(begin);
//因为我们传入后cur=head,head本身的位置并没有改变,但由于指针反转 所以head变为最后一个位置,begin.next=next代表连上我们设为null的指针
begin.next=next;
//设置新的前置节点,为下一次循环做准备
pre= begin;
//设置新的end节点,为下一次循环做准备
end=pre;
}
//返回新链表
return dummyHead.next;
}
//链表反转操作
private ListNode swap(ListNode head) {
ListNode pre=null;
ListNode cur=head;
while (cur!=null){
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}