题目描述:
解题思路:
题目总体思路不难,考的是代码能力和思路
同上一道题目,先设头结点 在函数reverseKGroup中设temp来记步长k,再调用reverseList函数来实现规定区间内的链表翻转,具体见代码
代码示例:
function reverseKGroup( head , k ) {
// write code here
// 特殊情况
if(head == null || head.next == null || k == 1) {
return head
}
let res = new ListNode(-1);
res.next = head;
let cur = res;
while(head !=null) {
let temp = cur;
// 查看剩余部分长度是否大于K
for(let i = 0; i < k; i++) {
temp = temp.next; // 使temp节点指向k步
if(temp == null) { // 表示若走到链表最后则直接返回,无需后续操作
return res.next
}
}
let nxt = temp.next; //因为要实现翻转,过程会丢失下一个链表节点,因此在实现翻转前,先保留下一个节点
[head, temp] = reverseList(head, temp);
// 把翻转过后的链表接到原链表上
cur.next = head;
// 刷新节点信息,为下一次循环操作做准备
temp.next = nxt;
cur = temp;
head = temp.next
}
return res.next
}
// 实现链表翻转
function reverseList(head, temp) { // 1->2->3
let pre = temp.next; // 保留翻转区间内下一个位置,为while条件判断终止条件
let res = null;
let cur = head;
while(cur != pre) { // 开始区间内的翻转
let Temp = cur.next;
cur.next = res;
res = cur;
cur = Temp;
}
// 返回修改后的链表结构 1<-2<-3
return [temp, head]
}