难度:困难 日期:2023年6月10日
给你链表的头节点
head
,每k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k
的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5]示例 2:
输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5]
方法:模拟
//这里反转链表会将原本链表之后的节点接到反转后的末尾节点之后
var reverseList = function(cur,tail) {
let pre = tail;
while(cur != tail){
let next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre
};
var reverseKGroup = function(head, k) {
if(k==1 || head.next==null) return head;
let cur = head;
let result = new ListNode(0,null);
let mask = result;
while(cur && cur.next != null){
let n = k;
//确定需要反转的末尾节点
while(cur.next != null && n > 1){
cur = cur.next;
n--;
}
if(n==1) {
//将翻转后的链表加入到返回链表之后
mask.next = reverseList(head,cur.next);
mask = head; //将mask更新到返回链表末尾
head = head.next;cur = head; //更新需要反转的链表范围
}
}
return result.next
};
结果