这道题用单向链表和双向链表都能写,因为对双向链表不是很熟,所以就用双向链表来写了。由于初始化的链表并没有放入任何元素,所以这个结点就当成哑结点来处理,而且这样对之后的增删操作也更便利。C语言代码如下:
typedef struct MyLinkedList {
int val;
struct MyLinkedList * pre;
struct MyLinkedList * next;
} MyLinkedList;
MyLinkedList* myLinkedListCreate() {
MyLinkedList * obj = (MyLinkedList *)calloc(1, sizeof(MyLinkedList));
return obj;
}
int myLinkedListGet(MyLinkedList* obj, int index) {
MyLinkedList * node = obj->next;
int cnt = 0;
while (node) {
if (cnt == index) {
return node->val;
}
node = node->next;
cnt++;
}
return -1;
}
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
MyLinkedList * newhead = (MyLinkedList *)malloc(sizeof(MyLinkedList));
newhead->val = val;
newhead->next = obj->next;
if (obj->next) {
obj->next->pre = newhead;
}
obj->next = newhead;
newhead->pre = obj;
}
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
MyLinkedList * node = obj;
while (node->next) {
node = node->next;
}
MyLinkedList * newtail = (MyLinkedList *)calloc(1, sizeof(MyLinkedList));
newtail->val = val;
newtail->pre = node;
node->next = newtail;
}
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
MyLinkedList * addnode = (MyLinkedList *)calloc(1, sizeof(MyLinkedList));
addnode->val = val;
if (index <= 0) {
addnode->next = obj->next;
if (obj->next) {
obj->next->pre = addnode;
}
obj->next = addnode;
addnode->pre = obj;
return;
}
int cnt = -1;
MyLinkedList * node = obj;
while (node->next) {
if (cnt + 1 == index) {
addnode->next = node->next;
node->next->pre = addnode;
node->next = addnode;
addnode->pre = node;
return;
}
cnt++;
node = node->next;
}
if (cnt + 1 == index) {
node->next = addnode;
addnode->pre = node;
} else {
free(addnode);
}
}
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
MyLinkedList * node = obj;
int cnt = -1;
while (node->next) {
if (cnt + 1 == index) {
node->next = node->next->next;
if (node->next) {
node->next->pre = node;
}
return;
}
cnt++;
node = node->next;
}
}
void myLinkedListFree(MyLinkedList* obj) {
free(obj);
}