LeetCode刷题,K个一组翻转链表(25)

1,754 阅读1分钟

k个一组翻转链表

给你一个链表每k个节点一组进行翻转,返回翻转后的链表

代码实现

var reverseKGroup = function(head, k) {
  if (!head) return null;
  let ret = new ListNode(-1,head); // 创建一个虚头
  let pre = ret; // p节点指向虚头 这样翻转之后,p 等于待翻转区域的前一个节点
  do {
    pre.next = reverse(pre.next, k); // p.next 代表翻转以后链表的尾节点
    for (let i = 0; i < k && pre; i++) {
      pre = pre.next; // 往后走k步
    }
    if (!pre) break; // 如果pre为空了 代表已经走到整个链表的尾部,直接停止循环
  } while (1);
  return ret.next; // 返回翻转的链表
};
var reverse = function(head,n){ // 翻转链表,从传入的头结点到第n个节点翻转
  let pre = head;
  let cur = head;
  let con = n;
  while (--n && pre) pre = pre.next; // 判断是否够n个节点
  if (!pre) return head; // 如果pre不存在说明不够n个节点,直接返回
  pre = null; // 置空
  while (con--) [cur.next, pre, cur] = [pre, cur, cur.next] ; // 翻转链表
  head.next = cur;
  return pre; // 返回翻转后的链表
}