LeetCode·707.设计链表·架构题

链接: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值