Given a LinkedList, every node contains a array. Every element of the array is char
implement two functions
1. get(int index) find the char at the index
2. insert(char ch, int index) insert the char to the index
Follow Up:
删除一个数怎么处理,需要注意的地方也就是如果node空了就删掉吧。
那就需要记录前一个node了,这样比较好删掉当前node。
其实插入的时候要考虑插到哪儿。
01234 56 78
abcde->fg->hi
(0) (1) (2)
例如说我要插到7,我该插到第一个还是第二个node,interviewer说自己决定(这个其实是随意的。
但是如果我要插一个k到2,我该新建个node吧
也就是akbcd->e->fg->hi
那如果我再插个l到2呢,那我不就要再建个node么 太bug:alkbc->d->e->fg->hi
所以应该每次node满的时候都移动这个node的两位或者三位到新的node:akb->cde->fg->hi
follow up:
这个maxL该怎么选择?
因为get每次是O(n),insert其实是O(n+maxL)。n是node的数量。
所以如果一直都是get的话,maxL可以设大一点。如果insert比较多的话maxL小一点
#include <iostream>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#define maxL 5
using namespace std;
class Node {
public:
int len;
char chars[maxL];
Node* next;
Node() : len(0) {}
};
class UnrolledLinkedList {
private:
Node* head;
int totalLen;
public:
UnrolledLinkedList(Node* n) {
head = n;
Node* tmp = head;
totalLen = 0;
while (tmp) {
totalLen += tmp->len;
tmp = tmp->next;
}
}
char get(int idx) {
if (idx < 0 || idx >= totalLen) return ' ';
Node* curr = head;
while (curr && idx >= curr->len) {
idx -= curr->len;
curr = curr->next;
}
return curr->chars[idx];
}
void insert(char ch, int idx) {
if (idx < 0 || idx > totalLen) return;
Node* curr = head;
Node* last = nullptr;
while (curr && (idx > curr->len || (idx == curr->len && curr->len == maxL))) {
idx -= curr->len;
last = curr;
curr = curr->next;
}
if (!curr) {
last->next = new Node();
curr = last->next;
}
if (curr->len == maxL) {
Node* tmp = curr->next;
curr->next = new Node();
for (int i = 0; i < 3; i++)
curr->next->chars[i] = curr->chars[i + 2];
curr->next->len = 3;
curr->len -= 3;
curr->next->next = tmp;
}
for (int i = curr->len; i > idx; i--)
curr->chars[i] = curr->chars[i - 1];
curr->chars[idx] = ch;
curr->len++;
totalLen++;
}
void deleteull(int idx) {
if (idx < 0 || idx >= totalLen) return;
Node* curr = head;
Node* last;
while (curr && idx >= curr->len) {
idx -= curr->len;
last = curr;
curr = curr->next;
}
for (int i = idx; i < curr->len - 1; i++){
curr->chars[i] = curr->chars[i + 1];
}
curr->len--;
if (curr->len)
curr->chars[curr->len] = ' ';
else last->next = curr->next;
}
};
void print(Node* n) {
while (n) {
for (int i = 0; i < n->len; i++)
cout<<n->chars[i];
cout<<'/';
n = n->next;
}
cout<<endl;
}
int main(int argc, char *argv[]) {
Node* n1 = new Node();
Node* n2 = new Node();
Node* n3 = new Node();
n1->chars[0] = '0';
n1->chars[1] = '1';
n2->chars[0] = '2';
n2->chars[1] = '2';
n3->chars[0] = '3';
n3->chars[1] = '4';
n3->chars[2] = '5';
n3->chars[3] = '6';
n3->chars[4] = '7';
n1->next = n2;
n2->next = n3;
n1->len = 2;
n2->len = 2;
n3->len = 5;
print(n1);
UnrolledLinkedList* ll = new UnrolledLinkedList(n1);
ll->insert('8', 3);
ll->insert('9', 3);
ll->insert('9', 11);
ll->insert('9', 3);
print(n1);
ll->insert('a', 7);
print(n1);
ll->deleteull(3);
print(n1);
ll->deleteull(2);
ll->deleteull(2);
ll->deleteull(2);
print(n1);
}