力扣 题目25-- K 个一组翻转链表
题目
题解
我们先想一下如果把整个链表翻转的应该怎么做?
是不是可以用栈去存放链表的每一个节点地址 如果再取顶即可
同理 我们可以把每k个节点当作一个链表 然后进行反转 然后连接他们
显而易见可以使用递归法 返回的就是每一个链表的头结点 然后用每一个链表的最后一个结点的next接收 这样所有的链表就能连接
至于结束条件 题目中这样写到
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
那么我们需要判断一下
1.在将链表放入栈时 在k次循环中链表是否为NULL 是则直接输出 head即可
2.链表为空和k=1 直接输出 head即可
代码
1 #include<iostream> 2 #include<vector> 3 #include<stack> 4 using namespace std; 5 struct ListNode { 6 int val; 7 ListNode* next; 8 ListNode() : val(0), next(nullptr) {} 9 ListNode(int x) : val(x), next(nullptr) {} 10 ListNode(int x, ListNode* next) : val(x), next(next) {} 11 }; 12 13 class Solution { 14 public: 15 ListNode* reverseKGroup(ListNode* head, int k) { 16 //链表为空和k=1 直接输出 head即可 17 if (head==nullptr||k == 1) { 18 return head; 19 } 20 ListNode* list1 = head; 21 ListNode* result; 22 stack<ListNode*> reversal; 23 //将链表放入栈 24 for (int i = 0; i < k; i++) { 25 //在k次循环中链表是否为NULL 是则直接输出head即可 26 if (list1 == nullptr) { 27 return head; 28 } 29 reversal.push(list1); 30 list1 = list1->next; 31 } 32 //先把头结点赋值 33 result = reversal.top(); 34 ListNode* list = result; 35 reversal.pop(); 36 //然后再考虑剩下的 37 while (!reversal.empty()) 38 { 39 result->next = reversal.top(); 40 result = result->next; 41 reversal.pop(); 42 } 43 //找链表的下一个 44 result->next = reverseKGroup(list1, k); 45 return list; 46 } 47 }; 48 void listnum(ListNode& list, vector<int>& vectorlist) { 49 ListNode* headlist = &list; 50 for (int i = 0; i < vectorlist.size(); i++) { 51 ListNode* p; 52 p = (struct ListNode*)malloc(sizeof(struct ListNode*)); 53 p->val = vectorlist[i]; 54 headlist->next = p; 55 headlist = headlist->next; 56 } 57 headlist->next = NULL; 58 } 59 int main() { 60 Solution sol; 61 ListNode list1(1); 62 vector<int> vectorlist1 = { 2,3,4,5,6 }; 63 listnum(list1, vectorlist1); 64 ListNode* list = sol.reverseKGroup(&list1,2); 65 for (int i = 0; list != NULL; i++) { 66 cout << list->val << endl; 67 list = list->next; 68 } 69 }