提前批面试记录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;
}
用上面代码跑为什么会把输入都输出一遍 如下