707. 设计链表(力扣刷题)(C语言题解)

本文介绍了如何在LeetCode中设计链表,包括创建链表、获取值、在头尾添加节点、指定位置插入和删除节点,以及使用虚拟头节点简化操作。作者强调了链表调试的困难和正确处理边界条件的重要性。
摘要由CSDN通过智能技术生成

个人博客主页:https://blog.csdn.net/2301_79293429?type=blog
专栏:https://blog.csdn.net/2301_79293429/category_12545690.html

题目链接:

707. 设计链表 - 力扣(LeetCode)

该题为中等题,包括了对链表的大部分常用操作,更改真的很烦,因为它很长,链表题目也不方便调试,不知道哪里有问题,你只有一点一点的对比代码才找得到错哪

AC代码:



/*一定要建立虚拟头节点,方便的多--->统一操作,避免每次都要将头节点单独讨论*/

typedef int VALTYPE;/*方便更改数据类型*/

/*链表的基本创建*/
typedef struct MyLinkedList {
    VALTYPE val;
    struct MyLinkedList* next;
}MyLinkedList;

MyLinkedList* myLinkedListCreate() 
{
    MyLinkedList* head=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    head->val=0;
    head->next=NULL;
    return head;
}

int myLinkedListGet(MyLinkedList* obj, int index) 
{
    /*这里的obj是我们创建的虚拟头节点,所以要令p=obj->next*/
    
    MyLinkedList* p=obj->next;
    /*只是创建了一个指针变量,不需要动态开辟一块空间*/

    int i;
    for(i=0;p!=NULL;i++)
    {
        if(i==index)
            return p->val;
        if(p->next==NULL)
            return -1;
        p=p->next;
    }
    return -1;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) 
{
    MyLinkedList* p1=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    /*创建了一个结构体,需要动态开辟一块空间*/

    p1->val=val;
    p1->next=obj->next;
    /*注意顺序,要先将新节点的next指向obj的next,再更新obj的next*/
    obj->next=p1;
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) 
{
  

    /*正确写法*/
    MyLinkedList* p=obj;/*不是obj->next了,因为也要对头节点进行判断是否为null*/

    for(int i=0;p->next!=NULL;i++)
    {           /**/
        p=p->next;
    }

    MyLinkedList* p1=(MyLinkedList*)malloc(sizeof(MyLinkedList));
    p1->next=NULL;
    p1->val=val;
    p->next=p1;
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) 
{
    
    if (index == 0) /**/
    {
        myLinkedListAddAtHead(obj, val);
        return;
    }

     MyLinkedList* p=obj->next;

     for(int i=1;p!=NULL;i++)
     {/*要从1开始,0要特殊处理*/
         if(i==index)
         {/*要等于index*/
            MyLinkedList* p2=(MyLinkedList*)malloc(sizeof(MyLinkedList));
            p2->val=val;
             p2->next=p->next;
             p->next=p2;
             return;/*直接return*/
         }
         p=p->next;
     }



void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) 
{
    MyLinkedList* p=obj;
    for(int i=-1;p!=NULL&&p->next!=NULL;i++)
    {
        if(i==index-1)
        {
           MyLinkedList* temp=p->next;
            p->next=p->next->next;
            free(temp);
            break;
        }
        p=p->next;
    }
}

void myLinkedListFree(MyLinkedList* obj) 
{
    struct MyLinkedList*p=obj->next;
    for(int i=0;p!=NULL;i++)
    {
        struct MyLinkedList*temp=p;
        p=p->next;
        free(temp);
    }
}

/**
 * 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);
*/

最后祝大家题题AC,只盼做个WA梦 ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好的小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值