zoukankan      html  css  js  c++  java
  • leetcode

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.

    If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.

    You may not alter the values in the nodes, only nodes itself may be changed.

    Only constant memory is allowed.

    For example,
    Given this linked list: 1->2->3->4->5

    For k = 2, you should return: 2->1->4->3->5

    For k = 3, you should return: 3->2->1->4->5

    题目大意,按照k来对链表进行分组,然后对每组进行逆序,若该组的结点数比k小,则保持链表不变

    个人思路:

    1,先计算链表长度,记为length,结合k,可计算出组数group,然后就是对于每组结点做反转

    2,对于反转,我设置了3个指针,preGroup指向前一个组的最后一个结点,current指向当前结点,pre指向当前结点的前一个结点,每次循环,都是把current指向的结点插入到preGroup指向的结点之后,直到该组的结点都遍历完

    3,重新设置一下这3个指针,继续2的步骤,直到所有组都反转

    代码:

     1 #include <stddef.h>
     2 
     3 struct ListNode
     4 {
     5     int val;
     6     ListNode *next;
     7     ListNode(int x) : val(x), next(NULL) {}
     8 };
     9 
    10 class Solution {
    11 public:
    12     ListNode *reverseKGroup(ListNode *head, int k) {
    13         if (!head || k < 2)
    14         {
    15             return head;
    16         }
    17 
    18         ListNode dummy(-1);
    19         dummy.next = head;
    20         ListNode *current = dummy.next;
    21         int length = 0;
    22 
    23         while (current)
    24         {
    25             current = current->next;
    26             ++length;
    27         }
    28 
    29         int group = length / k;
    30         ListNode *preGroup = &dummy;
    31         ListNode *pre = &dummy;
    32         current = dummy.next;
    33 
    34         for (int i = 0; i < group; ++i)
    35         {
    36             preGroup = pre;
    37             pre = current;
    38             current = current->next;
    39 
    40             for (int j = 0; j < k - 1; ++j)
    41             {
    42                 pre->next = current->next;
    43                 current->next = preGroup->next;
    44                 preGroup->next = current;
    45 
    46                 current = pre->next;
    47             }
    48         }
    49 
    50         return dummy.next;
    51     }
    52 };
    View Code

    看了一下网上的思路,基本差不多(除了递归版的),关于反转,除了把current结点插入到preGroup之后,也可以把current结点插入到nextGroup(下一个组的头结点)之前,也算是拓展一下我的思维方式,防止思维定势

  • 相关阅读:
    类和对象
    数组
    随笔3
    设计把所有的奇数移动到所有偶数前面的算法
    选择排序
    队列的链式存储结构
    循环队列
    一起玩算法(把所有相同的数字后移)
    判断序列B是否是序列A的连续子序列
    power bi创建切片器导航
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3957814.html
Copyright © 2011-2022 走看看