zoukankan      html  css  js  c++  java
  • 25. Reverse Nodes in k-Group

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
      
     /**
      * use three pointer, a, b, mid.
      * iterator k times
      * every time, a0 a->b => a0<-a b 
      
      * pre -> 1 -> 2 -> 3 -> 4 -> 5 -> 6...
      *   |    |    |
      *   a0   a    b
      * pre <- 1    2 -> 3 -> 4 -> 5 -> 6...
      *        |    |    |
      *       a0    a    b
      * pre <- 1 <- 2    3 -> 4 -> 5 -> 6...
      *        |    |    |    |
      *     head   a0    a    b
      * at the end, a0 is the new head, and the original head points to the sub-list(reverse the sub-list)
      * Then recursion the whole process
      
      * Corner Case:
      * 1 When a is the last node in the list, b = NULL, then b->next could cause run time error
      * 2 if k == 1, return
      * 3 if k > list length ,return
      * 4 if head == NULL or head->next == NULL, return
      
      
      */
    class Solution {
    public:
        ListNode* reverseKGroup(ListNode* head, int k) {
            int len = k;
            ListNode * pnode = head;
             
            while(len > 0 && pnode!=NULL ){
                pnode=pnode->next;
                len--;
            }
            if(len != 0 ) return head;//case 3
            if(k <= 1 || head ==NULL || head->next == NULL)return head;//case 2 and case 4
             
            ListNode pre(0);
            ListNode *a0 = &pre, *a = head, *b = head->next;
            len = k;
            while(len > 0){
                a->next = a0;
                a0 = a;
                a = b;
                if(b)b = a->next;//case 1
                len--;
            }
             
            head->next = reverseKGroup(a,k);
            return head = a0;
             
        }
    };




  • 相关阅读:
    极致:互联网时代的产品设计
    赋能
    从历史看管理
    格调
    @Value注解没有起作用的梳理
    装系统------- 了解常用的启动方式以及如何进入bios
    装系统 ------ 使用微PE 做系统盘
    eclipse ------------- 安装maven ,配置setting文件
    Maven ------ 了解与安装
    sqlException 使用relace 替换单引号
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/6282499.html
Copyright © 2011-2022 走看看