代码随想录算法训练营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);
    }

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值