LeetCode25. K 个一组翻转链表

题目

分析

类比LeetCode24.两两交换链表种的节点

代码

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     ListNode* reverseKGroup(ListNode* head, int k) {
14         auto dummy  = new ListNode(-1),p = dummy;
15         dummy->next = head;
16 
17         while(1){
18             //1. 首先判断有无 k 个节点
19             auto q = p;
20             for(int i = 0;i < k && q;i++) q = q->next;
21             if(!q) break; //没有k个节点就停
22 
23             //2. 对k个节点内部反转,就是两两节点换边的方向(k 个节点反转需要k-1次反转边)
24             auto a = p->next,b = a->next; 
25             for(int i = 0;i < k - 1;i++){
26                 auto c = b->next;
27                 b->next = a;
28                 a = b,b = c;
29             }
30             
31             //注意结束时 a 在 k 个节点最后一个位置,b在k+1节点
32 
33             //3.处理边界
34             auto c = p->next;
35             
36             p->next = a,c->next = b;
37             p = c;
38         }
39 
40         return dummy->next;
41     }
42 };

 

时间复杂度O(N)

 

posted @ 2022-04-02 10:47  Uitachi  阅读(18)  评论(0编辑  收藏  举报