• [LeetCode系列] K节点倒序问题迭代解法


    给定链表和整数k, 使用in-space方法将链表按k个为一组进行倒序, 如果剩余个数不足k个则保留其原始顺序.

    如给定1->2->3->4->5, k = 2, 需要返回 2->1->4->3->5; 给定1->2->3->4->5, k = 3, 需要返回 3->2->1->4->5.

    算法描述:

    1. 使用指针cur遍历链表;
    2. 使用指针pilot探索链表, 如果剩余个数不够, 跳出循环, 算法结束; 如果个数足够, 则进行下一步;
    3. 只要指针cur和pilot没有相遇, 就依次交换相邻的node;
    4. 重新设置cur和pilot, 返回第2步.

    需要说明的是第三步交换相邻的node:

    我们设需要交换的2个node分别为cur和cur->next, 这里用到2个指针: pre指向cur的前一个节点. 变换过程如下

     ListNode *nt = cur->next->next; 

     nt保存后节点(需要交换的2节点之后的节点)信息.

     cur->next->next = pre->next; 

     把第2个节点指向第1个节点(新方向).

     pre->next = cur->next; 

     把前节点(需要交换的2节点之前的节点)指向第2个节点(重新构造开头).

     cur->next = nt; 

     把第1个节点指向后节点(重新构造结尾).

    整理后, 两个橘黄色节点已经对调, 并且两者前后节点未变.

    结束.

     

    代码:

     1 class Solution {
     2 public:
     3     ListNode *reverseKGroup(ListNode *head, int k) {
     4         if (head == NULL) return NULL;
     5         ListNode *dummy = new ListNode(0);
     6         dummy->next = head;
     7         ListNode *pre = dummy;
     8         ListNode *cur = head;
     9         while(cur != NULL) {
    10             ListNode *pilot = pre->next;
    11             int remaining = k;
    12             while (pilot != NULL && remaining-- > 0) pilot = pilot->next;
    13             if (remaining > 0) break;
    14             while(cur->next != pilot) {
    15                 ListNode *nt = cur->next->next;
    16                 cur->next->next = pre->next;
    17                 pre->next = cur->next;
    18                 cur->next = nt;
    19             }
    20             pre = cur;
    21             cur = cur->next;
    22         }
    23         return dummy->next;
    24     }
    25 };

     

  • 相关阅读:
    XCode颜色显示插件
    Xcode4的color theme保存路径
    Direct2D教程(四)Path Geometry
    Direct2D教程(六)图形也能做运算
    Direct2D教程(五)复合图形
    Direct2D教程(七)单色画刷
    Direct2D QuickStart
    Direct2D教程(一)Direct2D已经来了,谁是GDI的终结者?
    Direct2D入门
    Texture
  • 原文地址:https://www.cnblogs.com/lancelod/p/3968830.html
Copyright © 2020-2023  润新知