LeetCode25. K 个一组翻转链表
题目
分析
代码
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)