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;
    //其实这里应该是private(假的!不能是private不然UnrolledLinkedList的class就读不到了
    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) {
//ask: idx begin from 1 or 0?
        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))) {    
                                            //attention to this!!!!
            idx -= curr->len;
            last = curr;
            curr = curr->next;    //don't forget!
        }
        //两种特殊情况:要插到最后,以及当前node是满的所以要新增node。反正都是先加了node,然后再插入char
        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;    //记得update len
            curr->len -= 3;    //这里也是!!
            curr->next->next = tmp;
        }
//        cout<<curr->len<<idx<<endl;
        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;    //don't forget
        while (curr && idx >= curr->len) {
            idx -= curr->len;
            last = curr;
            curr = curr->next;
        }
//        cout<<"len"<<curr->len<<endl;
        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] = ' ';    
            //现场写了'',被面试官吐槽说这个c++做不到吧,如果等于空格也没有意义
            //反正就只用len来限定就好了咯,都依你,这样想想,面试官c++好好
        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(); //a b
    Node* n2 = new Node(); //b
    Node* n3 = new Node(); //a b c d e

    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);
    //cout<<ll->get(7);    
    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);
}

results matching ""

    No results matching ""