模块化思想(基于LeetCode-25)
总结
许多问题都可以分解为不同的子问题,将子问题写成单独的函数,可以使得整个程序结构更加清楚;
在归并排序中,将归并的步骤单独列出;在快速排序中,将分割的步骤单独列出;在翻转列表的问题中,将翻转的方式单独列出。
题目:K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5 
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
代码实现
| 12
 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
 
 | struct ListNode{int val;
 ListNode* next;
 ListNode(int x): int val, next(NULL){}
 };
 class solution{
 public:
 pair<ListNode*, ListNode*> reverse(ListNode* head, ListNode* tail){
 ListNode* prev = tail->next;
 ListNode* p = head;
 while(prev != tail){
 ListNode* nex = p->next;
 p->next = prev;
 prev = p;
 p = nex;
 }
 return{tail, head};
 }
 ListNode* reverseKGroup(ListNode* head, int k){
 
 ListNode* newhead = new ListNode(0);
 newhead->next = head;
 
 ListNode* prev = newhead;
 while(head){
 
 ListNode* tail = prev;
 for (int i = 1; i <= k; ++i){
 tail = tail->next;
 }
 
 ListNode* nex = tail->next;
 tie{head, tail} = reverse(head, tail);
 
 prev->next = head;
 tail->next = nex;
 
 prev = tail;
 head = tail->next;
 }
 }
 return newhead;
 }
 
 | 
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
             
            
            
            
                
            
            
        
This is copyright.