到底是不是一定要用linked list 呢Orz
別人用queue寫好像很清新啊 囧
先不加TBD好了我覺得好灰心屋屋屋
struct Node {
int val;
struct Node* next;
struct Node* pre;
};
typedef struct {
int size;
int curr;
struct Node* head;
struct Node* tail;
} MyCircularDeque;
MyCircularDeque* myCircularDequeCreate(int k) {
MyCircularDeque* ret = calloc (1, sizeof(MyCircularDeque));
ret->size = k;
ret->curr = 0;
ret->head = NULL;
ret->tail = NULL;
return ret;
}
bool myCircularDequeInsertFront(MyCircularDeque* obj, int value) {
if (obj->curr == obj->size)
return false;
struct Node *ptr = obj->head;
struct Node *new = calloc (1, sizeof(struct Node));
new->val = value;
if (ptr != NULL) //有head
{
new->pre = obj->head->pre;
if (obj->head->pre != NULL)
obj->head->pre->next = new;
new->next = obj->head;
obj->head->pre = new;
}
else // no head
{
new->next = ptr;
new->pre = ptr;
obj->tail = new;
}
obj->tail->next=new;
obj->head = new;
obj->curr ++;
return true;
}
bool myCircularDequeInsertLast(MyCircularDeque* obj, int value) {
if (obj->curr == obj->size)
return false;
if (obj->curr ==0)
return myCircularDequeInsertFront(obj,value);
struct Node *ptr = obj->tail;
struct Node *new = calloc (1, sizeof(struct Node));
new->val = value;
new->next = obj->head;
new->pre = obj->tail;
if (obj->tail != NULL)
obj->tail->next = new;
obj->tail = new;
obj->curr++;
return true;
}
bool myCircularDequeDeleteFront(MyCircularDeque* obj) {
if (obj->curr ==0)
return false;
obj->curr--;
if (obj->curr ==0)
{
obj->head = NULL;
obj->tail = NULL;
return true;
}
obj->tail->next = obj->head;
obj->head->next->pre=obj->tail;
obj->head = obj->head->next;
return true;
}
bool myCircularDequeDeleteLast(MyCircularDeque* obj) {
if (obj->curr ==0)
return false;
obj->curr--;
if (obj->curr ==0)
{
obj->head = NULL;
obj->tail = NULL;
return true;
}
obj->tail->pre->next = obj->tail->next;
obj->tail= obj->tail->pre;
return true;
}
int myCircularDequeGetFront(MyCircularDeque* obj) {
return (obj->head !=NULL)?(obj->head->val):(-1);
}
int myCircularDequeGetRear(MyCircularDeque* obj) {
return (obj->tail !=NULL)?(obj->tail->val):(-1);
}
bool myCircularDequeIsEmpty(MyCircularDeque* obj) {
return (obj->curr==0)?(true):(false);
}
bool myCircularDequeIsFull(MyCircularDeque* obj) {
return (obj->curr==obj->size)?(true):(false);
}
void myCircularDequeFree(MyCircularDeque* obj) {
free(obj);
}
/**
* Your MyCircularDeque struct will be instantiated and called as such:
* MyCircularDeque* obj = myCircularDequeCreate(k);
* bool param_1 = myCircularDequeInsertFront(obj, value);
* bool param_2 = myCircularDequeInsertLast(obj, value);
* bool param_3 = myCircularDequeDeleteFront(obj);
* bool param_4 = myCircularDequeDeleteLast(obj);
* int param_5 = myCircularDequeGetFront(obj);
* int param_6 = myCircularDequeGetRear(obj);
* bool param_7 = myCircularDequeIsEmpty(obj);
* bool param_8 = myCircularDequeIsFull(obj);
* myCircularDequeFree(obj);
*/
沒有留言:
張貼留言