力扣题目链接
typedef struct MyLinkedList {int val;struct MyLinkedList* next;
}MyLinkedList;/** Initialize your data structure here. */MyLinkedList* myLinkedListCreate() {//这个题必须用虚拟头指针,参数都是一级指针,头节点确定后没法改指向了!!!MyLinkedList* head = (MyLinkedList *)malloc(sizeof (MyLinkedList));head->next = NULL;return head;
}/** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */
int myLinkedListGet(MyLinkedList* obj, int index) {MyLinkedList *cur = obj->next;for (int i = 0; cur != NULL; i++){if (i == index){return cur->val;}else{cur = cur->next;}}return -1;
}/** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {MyLinkedList *nhead = (MyLinkedList *)malloc(sizeof (MyLinkedList));nhead->val = val;nhead->next = obj->next;obj->next = nhead;}/** Append a node of value val to the last element of the linked list. */
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {MyLinkedList *cur = obj;while(cur->next != NULL){cur = cur->next;}MyLinkedList *ntail = (MyLinkedList *)malloc(sizeof (MyLinkedList));ntail->val = val;ntail->next = NULL;cur->next = ntail;
}/** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {if (index == 0){myLinkedListAddAtHead(obj, val);return;}MyLinkedList *cur = obj->next;for (int i = 1 ;cur != NULL; i++){if (i == index){MyLinkedList* newnode = (MyLinkedList *)malloc(sizeof (MyLinkedList));newnode->val = val;newnode->next = cur->next;cur->next = newnode;return;}else{cur = cur->next;}}
}/** Delete the index-th node in the linked list, if the index is valid. */
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {if (index == 0){MyLinkedList *tmp = obj->next;if (tmp != NULL){obj->next = tmp->next;free(tmp); }return;}MyLinkedList *cur = obj->next;for (int i = 1 ;cur != NULL && cur->next != NULL; i++){if (i == index){MyLinkedList *tmp = cur->next;if (tmp != NULL) {cur->next = tmp->next;free(tmp);}return;}else{cur = cur->next;}}}void myLinkedListFree(MyLinkedList* obj) {while(obj != NULL){MyLinkedList *tmp = obj;obj = obj->next;free(tmp);}
}
看着很长,其实理解了就很容易打出来,但是理解也不容易哈哈哈~
就算理解了,会敲代码也是两回事,数学层面的理解和机器(代码)层面的理解转换也是很重要哒!
嗯嗯,我还没从数学层面的理解转换的机器层面上来,所以还是独立敲不出来,但是多练习几次一定可以做到的,因为我之前题目也是这么一个情况哈哈哈
一、出错点
1.关于创建虚拟头结点的理解
2.不知道该开辟哪些内存空间
3.对于链表操作不熟悉
二、理解后的思路
其实这题主要讲的就是数据结构中链表的应用,增删改查等
所以它主要考察的就是对知识点的掌握记忆与熟练运用
代码随想录 (programmercarl.com) 详细了解请看这个
不过我觉得这个讲解的也不是特别详细,它是针对于这个题目来讲解的,所以想真正掌握学懂这个知识点我推荐大家去看《大话数据结构》里面的链表知识点!!!
关于我自己也不是特别熟悉的理解它,所以我就先不说自己的理解了,怕误人子弟。
三、总结
要学会简化题目,找到对应的知识点,从简单的开始了解学习。
然后需要多多练习链表的基本操作,先看《大话数据结构》里面的知识点进行逐步了解!