力扣 题目25-- K 个一组翻转链表

题目


题解


 

我们先想一下如果把整个链表翻转的应该怎么做?

是不是可以用栈去存放链表的每一个节点地址 如果再取顶即可

同理 我们可以把每k个节点当作一个链表 然后进行反转  然后连接他们

显而易见可以使用递归法 返回的就是每一个链表的头结点 然后用每一个链表的最后一个结点的next接收 这样所有的链表就能连接

至于结束条件 题目中这样写到

如果节点总数不是 的整数倍,那么请将最后剩余的节点保持原有顺序。

那么我们需要判断一下

 

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 }
View Code

 


 

posted @ 2022-04-13 10:40  无聊的阿库娅  阅读(28)  评论(0编辑  收藏  举报