链表 Day03 | | 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表

链表part01



前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、移除链表元素

力扣题目:203. 移除链表元素

思路一:直接操作链表

1.步骤

  1. 遍历判断头结点是否为空,以及头结点的值是否等于目标值

2.代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val) {

    while (head&&head->val==val){
        head=head->next;
    }
    struct ListNode* curr=head;
    struct ListNode* next=NULL;
    while(curr&&(next=curr->next)){
        if(next->val==val){
            curr->next=next->next;
            free(next);
        }else{
            curr=curr->next;
        }
    }
    return head;
}

二、设计链表

力扣题目:707. 设计链表

1.代码实现




typedef struct MyLinkedList{
    int val;
    struct MyLinkedList* next;
} MyLinkedList;


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

int myLinkedListGet(MyLinkedList* obj, int index) {
    MyLinkedList* curr=obj->next;
    int i=0;
    while(curr!=NULL){
        if(i==index){
            return curr->val;
        }else
        curr=curr->next;
        i++;
    }
    return -1;
}

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
    MyLinkedList* new_node=malloc(sizeof(MyLinkedList));

    new_node->val=val;
    new_node->next=obj->next;
    obj->next=new_node;
}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
    MyLinkedList* curr=obj;
    while(curr->next!=NULL){
        curr=curr->next;
    }
    MyLinkedList* new_node=malloc(sizeof(MyLinkedList));
    new_node->val=val;
    new_node->next=NULL;
    curr->next=new_node;
}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
    if(index==0){
        myLinkedListAddAtHead(obj,val);
        return;
    }
    MyLinkedList* curr=obj->next;
    
    
    int i=1;
    while(curr){
        if(index==i){
            MyLinkedList* new_node=malloc(sizeof(MyLinkedList));
            if(!new_node){
                exit(1);
            }
            new_node->val=val;
            new_node->next=curr->next;
            curr->next=new_node;
            return;
        }else{
            curr=curr->next;
        }
        i++;
    }
    
}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
    if(index==0){
        MyLinkedList* tmp=obj->next;
        if(tmp!=NULL){
        obj->next=tmp->next;
        free(tmp);
        }
        return;
    }
    int i=1;
    MyLinkedList* curr=obj->next;
    while(curr&&curr->next){
        if(i==index){
            MyLinkedList* temp=curr->next;
            if(temp!=NULL){
            curr->next=temp->next;
            free(temp);
            }
            return;
        }
        else{
            curr=curr->next;
        }


    }
}

void myLinkedListFree(MyLinkedList* obj) {
    while(obj!=NULL){
        MyLinkedList* tmp=obj;
        obj=obj->next;
        free(tmp);
    }
}


我的代码不能通过全部示例应该是用了while没用for吧?
正确的代码代码随想录

三、反转链表

1.步骤

1.创建两个指针一个保存前置结点pre一个为临时结点temp
2.通过循环逐一保存头结点的下一个结点信息;将头结点的next"连接"至前置节点。将前置结点与头结点交换并更新头结点为下一个结点的。
3.当头结点为空时结束循环并返回pre。

2.代码实现


 typedef struct ListNode_s {
      int val;
      struct ListNode_s *next;
}ListNode;
ListNode* reverseList(ListNode* head) {
     ListNode* temp;
     ListNode* pre=NULL;
     while(head){
        temp=head->next;
        head->next=pre;
        pre=head;
        head=temp;
     }
     return pre;
}

总结

前段时间没有时间完成算法题,慢慢追赶进度。
再学习进阶的如创建虚拟头结点删除元素以及如何递归的反转链表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GIVENJOY.L

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

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

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

打赏作者

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

抵扣说明:

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

余额充值