链接:https://leetcode.cn/problems/design-linked-list/solution/xu-by-xun-ge-v-l7kr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


解题思路
设计链表并实现基本功能应该是入门数据结构的基础吧
简单链表需要实现的四大基本功能:
- //将值为 val 的节点追加到链表的index位置
- void myLinkedListAddAtMid(MyLinkedList* obj, int index, int val)
- {
- obj->len++;
- while(index--)
- {
- obj = obj->next;
- }
- MyLinkedList * n = malloc(sizeof(MyLinkedList));
- n->val = val;
- n->next = obj->next;
- obj->next = n;
- return;
- }
- //如果索引 index 有效,则删除链表中的第 index 个节点。
- void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
- if(obj->len > index)
- {
- obj->len--;
- while(index--)
- {
- obj = obj->next;
- }
- MyLinkedList * n = obj->next;
- obj->next = obj->next->next;
- free(n);
- }
- return;
- }
- //修改 index 节点的值为 val
- void myLinkedList(MyLinkedList* obj, int index, int val)
- {
- while(index--)
- {
- obj = obj->next;
- }
- obj->next->val = val;
- return;
- }
- //获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- int myLinkedListGet(MyLinkedList* obj, int index) {
- if(obj->len > index)
- {
- while(index--)
- {
- obj = obj->next;
- }
- return obj->next->val;
- }
- return -1;
- }
对于本题并没有让我们实现改,其实也可以实现一下,毕竟这个也是基本功能
- typedef struct MyLinkedList{
- int val;
- int len;
- struct MyLinkedList * next;
- } MyLinkedList;
-
- //打印链表值
- void my_printf(MyLinkedList * obj)
- {
- while(obj->next)
- {
- printf("%d ", obj->next->val);
- obj = obj->next;
- }
- printf("\n");
- return;
- }
- //初始化
- MyLinkedList* myLinkedListCreate() {
- MyLinkedList * obj = malloc(sizeof(MyLinkedList));
- obj->len = 0;
- obj->next = NULL;
- return obj;
- }
- //修改 index 节点的值为 val
- void myLinkedList(MyLinkedList* obj, int index, int val)
- {
- while(index--)
- {
- obj = obj->next;
- }
- obj->next->val = val;
- return;
- }
- //获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- int myLinkedListGet(MyLinkedList* obj, int index) {
- if(obj->len > index)
- {
- while(index--)
- {
- obj = obj->next;
- }
- return obj->next->val;
- }
- return -1;
- }
- //在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点
- void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
- obj->len++;
- MyLinkedList * node = malloc(sizeof(MyLinkedList));
- node->val = val;
- node->next = obj->next;
- obj->next = node;
- return;
- }
- //将值为 val 的节点追加到链表的最后一个元素
- void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
- MyLinkedList * node = malloc(sizeof(MyLinkedList));
- obj->len++;
- node->val = val;
- node->next = NULL;
- while(obj->next)
- {
- obj = obj->next;
- }
- obj->next = node;
- return;
- }
- //将值为 val 的节点追加到链表的index位置
- void myLinkedListAddAtMid(MyLinkedList* obj, int index, int val)
- {
- obj->len++;
- while(index--)
- {
- obj = obj->next;
- }
- MyLinkedList * n = malloc(sizeof(MyLinkedList));
- n->val = val;
- n->next = obj->next;
- obj->next = n;
- return;
- }
- //在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
- if(index == obj->len)
- {
- myLinkedListAddAtTail(obj, val);
- }
- else if(index < 0)
- {
- myLinkedListAddAtHead(obj, val);
- }
- else if(index < obj->len)
- {
- myLinkedListAddAtMid(obj, index, val);
- }
-
- return;
- }
- //如果索引 index 有效,则删除链表中的第 index 个节点。
- void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
- if(obj->len > index)
- {
- obj->len--;
- while(index--)
- {
- obj = obj->next;
- }
- MyLinkedList * n = obj->next;
- obj->next = obj->next->next;
- free(n);
- }
- return;
- }
- //销毁链表
- void myLinkedListFree(MyLinkedList* obj) {
- while(obj)
- {
- MyLinkedList * n = obj;
- obj = obj->next;
- free(n);
- }
- return;
- }
-
- /**
- * Your MyLinkedList struct will be instantiated and called as such:
- * MyLinkedList* obj = myLinkedListCreate();
- * int param_1 = myLinkedListGet(obj, index);
-
- * myLinkedListAddAtHead(obj, val);
-
- * myLinkedListAddAtTail(obj, val);
-
- * myLinkedListAddAtIndex(obj, index, val);
-
- * myLinkedListDeleteAtIndex(obj, index);
-
- * myLinkedListFree(obj);
- */
-
- 作者:xun-ge-v
- 链接:https://leetcode.cn/problems/design-linked-list/solution/xu-by-xun-ge-v-l7kr/
- 来源:力扣(LeetCode)
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。