代码随想录算法训练营Day3|203.移除链表元素 ● 707.设计链表 ● 206.反转链表

代码随想录的文章和对应的题目链接:代码随想录

今天这三题我一开始都没有写出来,现在看完代码随想录,已经会写了,来看第一题,有两种方法,第一种方法就是在原链表上进行操作,也就是先判断head所指向的元素是不是目标元素,如果是的话,直接head=head->next即可,注意这里使用while循环的原因是如果出现这样的情况1,1,1,1,1,2要删除元素1,这样的话,这条语句就不止执行一次所以要用一个while循环,接着就是常规套路,但是注意while循环里要加上cur!=NULL因为当你上一个while结束后,head可能就是空了,所以要判断cur是不是空,具体代码如下

while(head!=NULL && head->val==val){
            head=head->next;
        }
        ListNode* cur=head;
        while(cur!=NULL && cur->next!=NULL){
            if(cur->next->val==val){
                cur->next=cur->next->next;
            }
             else cur=cur->next;
        }
        return head;

接着来看第二种方法,也就是虚拟头结点,先来看代码的实现

 ListNode* cur=new ListNode;
        cur->next=head;
        ListNode* cur1=cur;
        while(cur1->next!=NULL){
            if(cur1->next->val==val){
                cur1->next=cur1->next->next;
            }
            else cur1=cur1->next;
        }
        return cur->next;

这里在head之前定义了一个头结点,这样无论是对于头结点还是其他的结点,我们都可以用相同的操作来实现,后面就都是一样的,这就是第一题

题目链接/文章讲解/视频讲解::代码随想录

来看第二题,这一题我没写出来的原因不是因为我不会实现里面的函数。而是我没有搞懂里面的函数接口,搞得我有点混乱,其他的还是比较简单的,这里就不粘贴代码了,考虑边界条件,也就是index的值,其他的操作都比较简单,跳过

来看第三题https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html

这道题可以用两种方法来写,第一种是双指针法,定义一个pre和cur指针,不断遍历元素,让cur指向pre,直到cur遍历完所有的元素,来看具体代码的实现

ListNode* pre=NULL;
       ListNode* cur=head;
       while(cur!=NULL){
        ListNode* temp=cur->next;
        cur->next=pre;
        pre=cur;
        cur=temp;
       }
       return pre;

很简单的思路

第二种方法是递归法

先写一个函数,传入两个指针,也就是pre和cur,然后再主函数里调用就行了,同样的当传入的cur指针指向空时,return pre ,不然就和上面一样的步骤,最后在主函数里返回结果就行了,来看具体代码的实现

ListNode* reverseList(ListNode* head) {
       /*ListNode* pre=NULL;
       ListNode* cur=head;
       while(cur!=NULL){
        ListNode* temp=cur->next;
        cur->next=pre;
        pre=cur;
        cur=temp;
       }
       return pre;
       */
       return  Reverse(head,NULL);
    }
    ListNode* Reverse(ListNode* cur, ListNode* pre){
        if(cur==NULL) return pre;
        ListNode* t=cur->next;
        cur->next=pre;
        pre=cur;
        cur=t;
        return Reverse(cur,pre);
    }

这就是今天的博客,第二题没有太过讲,因为没有涉及到一些重要的方法,就是一些基础操作,我会继续加油,不断前进!

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我知道了。以下是对您的问题的回答: a. 动态分配内存的方法有很多,可以使用C语言的malloc函数,也可以使用C++中的new操作符,具体方法如下: C语言的malloc函数: ```c struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode)); ``` C++中的new操作符: ```c++ ListNode* node = new ListNode(); ``` b. 初始化单链表需要对链表节点的成员变量进行赋值,以下是一个示例: ```c++ struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* head = NULL; ``` c. 头插法创建单链表的示例代码如下: ```c++ ListNode* head = new ListNode(); head->next = NULL; for (int i = 0; i < n; i++) { int x; cin >> x; ListNode* node = new ListNode(x); node->next = head->next; head->next = node; } ``` 尾插法创建单链表的示例代码如下: ```c++ ListNode* head = new ListNode(); head->next = NULL; ListNode* tail = head; for (int i = 0; i < n; i++) { int x; cin >> x; ListNode* node = new ListNode(x); node->next = NULL; tail->next = node; tail = node; } ``` d. 取链表某一位的值可以通过遍历链表来实现,以下是一个示例: ```c++ ListNode* p = head->next; int pos = 3; for (int i = 1; i < pos && p != NULL; i++) { p = p->next; } if (p == NULL) { cout << "链表长度不足" << endl; } else { cout << p->val << endl; } ``` e. 在链表的某一位进行插入操作可以通过遍历链表找到插入位置,然后插入一个新节点来实现,以下是一个示例: ```c++ ListNode* p = head; int pos = 3; for (int i = 1; i < pos && p != NULL; i++) { p = p->next; } if (p == NULL) { cout << "链表长度不足" << endl; } else { int x = 100; ListNode* node = new ListNode(x); node->next = p->next; p->next = node; } ``` f. 遍历链表可以通过循环遍历链表节点来实现,以下是一个示例: ```c++ ListNode* p = head->next; while (p != NULL) { cout << p->val << " "; p = p->next; } cout << endl; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值