From 5f1b40adc44adef5b814debd0a2e6b7585f44020 Mon Sep 17 00:00:00 2001 From: Sainnhe Park Date: Tue, 15 Nov 2022 15:00:00 +0800 Subject: [PATCH] Update --- include/s0025_reverse_nodes_in_k-group.hpp | 22 +++++++++++ src/s0025_reverse_nodes_in_k-group.cpp | 44 ++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 include/s0025_reverse_nodes_in_k-group.hpp create mode 100644 src/s0025_reverse_nodes_in_k-group.cpp diff --git a/include/s0025_reverse_nodes_in_k-group.hpp b/include/s0025_reverse_nodes_in_k-group.hpp new file mode 100644 index 0000000..3dc5418 --- /dev/null +++ b/include/s0025_reverse_nodes_in_k-group.hpp @@ -0,0 +1,22 @@ +#ifndef S0025_REVERSE_NODES_IN_K_GROUP +#define S0025_REVERSE_NODES_IN_K_GROUP + +#include +#include + +using namespace std; + +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* reverseKGroup(ListNode* head, int k); +}; + +#endif diff --git a/src/s0025_reverse_nodes_in_k-group.cpp b/src/s0025_reverse_nodes_in_k-group.cpp new file mode 100644 index 0000000..f383fce --- /dev/null +++ b/src/s0025_reverse_nodes_in_k-group.cpp @@ -0,0 +1,44 @@ +#include "s0025_reverse_nodes_in_k-group.hpp" + +// 翻转一个子链表,并且返回新的头与尾 +pair myReverse(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* Solution::reverseKGroup(ListNode* head, int k) { + ListNode* hair = new ListNode(0); + hair->next = head; + ListNode* pre = hair; + + while (head) { + ListNode* tail = pre; + // 查看剩余部分长度是否大于等于 k + for (int i = 0; i < k; ++i) { + tail = tail->next; + if (!tail) { + return hair->next; + } + } + ListNode* nex = tail->next; + // 这里是 C++17 的写法,也可以写成 + // pair result = myReverse(head, tail); + // head = result.first; + // tail = result.second; + tie(head, tail) = myReverse(head, tail); + // 把子链表重新接回原链表 + pre->next = head; + tail->next = nex; + pre = tail; + head = tail->next; + } + + return hair->next; +}