美文网首页
leetcode 25. K 个一组翻转链表

leetcode 25. K 个一组翻转链表

作者: topshi | 来源:发表于2019-05-31 09:19 被阅读0次

题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
相关话题: 链表    难度: 困难

示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

思路:
思路很简单,基本方法和反转链表 II一样。
主要是确定边界,因为有可能最后剩余的节点不足k个。

  • 定义两个指针pqpq开始都指向子区间的开头节点的前驱
  • 先让qk步,如果走完k步,q != null则表示够k个,否则不够,直接结束
  • 反转完一个子区间的节点,更新pq的指向
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        head = dummy;
        ListNode p = head, q = p;
        ListNode cur = null;
        while(q != null){
            //让q先跑k步,判断区间内节点是否够k个
            for(int i = 0;i < k && q != null;i++){
                q = q.next;
            }
            //不够k个,直接跳出
            if(q == null) break;
            //否则反转子区间内的节点
            cur = p.next;
            for(int i = 1;i < k;i++){
                ListNode x = cur.next;
                cur.next = x.next;
                x.next = p.next;
                p.next = x;   
            }
            //开始下一个区间
            p = cur;
            q = p;
        }
        return head.next;
    } 
}

相关文章

网友评论

      本文标题:leetcode 25. K 个一组翻转链表

      本文链接:https://www.haomeiwen.com/subject/ssiitctx.html