题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
思路:
把k个节点传入反转函数;
注意点:
1、反转之后节点之间的关系要处理好;
2、把反转区间的头节点,结束节点传入反转的函数在一定程度上方便处理
3、为了方便处理关系,需要记录开始反转的上一个节点以及反转结束的下一个节点
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
function reverseKGroup(head, k) {
// write code here
let dummyHead = new ListNode("");
dummyHead.next = head;
let prev = dummyHead;
while (head) {
let tail = prev;
for (let i = 0; i < k; i++) {
tail = tail.next;
if (!tail) {
// 不满足直接返回即可
return dummyHead.next;
}
}
// 记录反转的结束点的下一个节点
let next = tail.next;
// 反转的开始节点、结束节点
[head, tail] = myReverse(head, tail);
// 重新构建指针
prev.next = head;
tail.next = next;
// 移动指针
prev = tail;
head = prev.next;
}
return dummyHead.next;
}
function myReverse(head, tail) {
let prev = tail.next;
let cur = head;
// 结束条件
while (prev !== tail) {
const nextNode = cur.next;
cur.next = prev;
prev = cur;
cur = nextNode;
}
return [tail, head];
}
module.exports = {
reverseKGroup: reverseKGroup,
};
vivo公司福利 368人发布

查看17道真题和解析