提前批面试记录bd
- 项目的特色、项目用到的开源库(技术选型)、为什么项目要这么设计(对项目的思考)
- 操作系统内存管理 进程地址空间
- 哈希表时间复杂度 怎么实现哈希表
- 哈希表扩容
- LRU页面置换算法
- k个结点反转链表 讲讲思路
- 读过什么源码
暂时就想起来这些
总结:项目要熟练、基础要扎实、手撕要逻辑清晰
#include <iostream> #include <memory> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int v): val(v), next(nullptr) {} }; class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { if (head == nullptr) { return head; } ListNode *tmp = head; int cnt = 0; while (tmp->next != nullptr && cnt < k - 1) { tmp = tmp->next; ++cnt; } if (cnt < k - 1) { return head; } ListNode *nextHead = reverseKGroup(tmp->next, k); tmp->next = nullptr; ListNode *newHead = reverse(head); tmp = newHead; while (tmp->next != nullptr) { tmp = tmp->next; } tmp->next = nextHead; return newHead; } ListNode* reverse(ListNode *root) { if (root == nullptr || root->next == nullptr) { return root; } ListNode *res = reverse(root->next); root->next = nullptr; ListNode *tmp = res; while (tmp->next != nullptr) { tmp = tmp->next; } tmp->next = root; return res; } }; int main() { int k; cin >> k; int v; ListNode *head = new ListNode(-1); ListNode* tmp = head; while (cin >> v) { if (v == 0) { break; } tmp->next = new ListNode(v); tmp = tmp->next; } Solution s; ListNode *res = s.reverseKGroup(head->next, k); tmp = res; while (tmp != nullptr) { cout << tmp->val << " "; tmp = tmp->next; } // delete while (head) { tmp = head; head = head->next; delete tmp; } return 0; }
用上面代码跑为什么会把输入都输出一遍 如下