代码随想录算法训练营 DAY3---备战秋招

主题:链表

链表基础复盘:

Java 数据结构与算法 - 链表 - zihengCat

刷题:

203.移除链表元素

图文讲解代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

视频讲解

手把手带你学会操作链表 | LeetCode:203.移除链表元素_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!代码随想录刷题网站:programmercarl.com, 视频播放量 109020、弹幕量 782、点赞数 2212、投硬币枚数 1709、收藏人数 673、转发人数 132, 视频作者 代码随想录, 作者简介 我是Carl,哈工大师兄,先后在腾讯和百度从事一线技术研发的程序员,公众号「代码随想录」,相关视频:一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵),国内算法大佬左程云VS清华大佬马士兵:Leetcode刷题200道,足以吊打字节面试官!,我更完了,你看完了吗?,两数之和 三数之和【基础算法精讲 01】,黑马程序员Java零基础视频教程_上部(Java入门,含斯坦福大学练习题+力扣算法题和大厂java面试题),Leetcode力扣 1-300题视频讲解合集|手画图解版+代码【持续更新ing】,大厂必备数据结构与算法Java视频教程(上篇),java高级程序员必学的数据结构与算法,黑马程序员Java项目实战《苍穹外卖》,最适合新手的SpringBoot+SSM的企业级Java项目实战,Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题),写出二叉树的非递归遍历很难么?这次让你不再害怕非递归!|二叉树的非递归遍历 | 二叉树的遍历迭代法 | 前序与中序icon-default.png?t=N7T8https://www.bilibili.com/video/BV18B4y1s7R9/题目及个人题解

203.移除链表元素
//思路一是采用虚拟头结点,这样做的好处是可以将头结点同其他节点一样共同处理
public ListNode removeElements(ListNode head, int val){
        //采用虚拟头结点 while 循环判断终止条件

        ListNode one = new ListNode();
        one.next=head;
        ListNode first =one;

        while(one.next!=null){
        ListNode tt=one.next;
            if(tt.val==val){
                one.next=tt.next;
            }else{
                one=one.next;
            }
    }


        return first.next;
}


//思路二是单独对头结点处理,其他节点的处理照旧 
//个人推荐第一种方法 ,第二种比较简单常规,偷个懒,在这里提一嘴

个人总结

针对链表移除有两种处理方法:

1.直接处理头结点,这种需要为我们单独处理一下头结点 if(headXXXX) XXX

2.虚拟头节点,在头结点前虚拟一个伪头结点,使得头结点可以向其他节点一起处理。

虚拟头结点的使用在链表中会很多,建议掌握。

707.设计链表

图文讲解代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

视频讲解帮你把链表操作学个通透!LeetCode:707.设计链表_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1FU4y1X7WD/题目及个人题解

707.设计链表
//本体内容是单链表,未做双链表,
//做双向链表的时候,需注意的是初始化的地方 head tail 
class MyLinkedList {

    int size;
    LinkNode head;

    class LinkNode{
     int val;
     LinkNode next;
     public LinkNode(){

     }
     public LinkNode(int val){
         this.val=val;
         this.next=null;
     }

    }


    public MyLinkedList() {
        this.size=0;
        this.head=null;
    }

    public int get(int index) {
        //不存在
        if(index>this.size-1) return -1;
        //存在
        LinkNode one =new LinkNode();
        one.next=this.head;
        while(index>=0){
            one=one.next;
            index--;
        }
        return  one.val;

    }

    public void addAtHead(int val) {
        LinkNode one =new LinkNode(val);
        LinkNode first=new LinkNode();
        first.next=this.head;
        one.next=this.head;
        first.next=one;
        this.head=first.next;
        this.size++;
    }

    public void addAtTail(int val) {
        LinkNode one =new LinkNode(val);
        LinkNode first=new LinkNode();
        first.next=this.head;
        while (first.next!=null){
            first=first.next;
        }
        first.next=one;
        if(size==0){
            this.head=first.next;
        }
        this.size++;
    }

    public void addAtIndex(int index, int val) {
        if(index>this.size){
            return;
        }else if(index==0){
            addAtHead(val);
        }else if(index==this.size){
            addAtTail(val);
        }else{
            LinkNode one =new LinkNode(val);
            LinkNode first=new LinkNode();
            LinkNode tt=new LinkNode();
            tt.next=this.head;
            first=tt;
            while(index>=1){
                first=first.next;
                index--;
            }
            one.next=first.next;
            first.next=one;
            this.size++;
            this.head=tt.next;
        }
    }

    public void deleteAtIndex(int index) {
        if(index>this.size-1){
            return;
        }else{
            this.size--;
            LinkNode first=new LinkNode();
            first.next=this.head;
            if(index==0){
                first.next=first.next.next;
                this.head=first.next;
            }
            while(index>0){
                first=first.next;
                index--;
            }
           if( first==null||first.next==null){
               return;
           }else{
               first.next=first.next.next;
           }


        }
    }
}

个人总结

上述代码存在优化之处,我们可以将addAtIndex方法写的全面完善一些,addAtHead,Tail方法则可以直接调用该方法。

206.反转链表

图文讲解代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

视频讲解帮你拿下反转链表 | LeetCode:206.反转链表 | 双指针法 | 递归法_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1nB4y1i7eL/

题目及个人题解

206.反转链表
//三种方法 1.虚拟头结点 2.双指针 3.递归
public ListNode reverseList(ListNode head) {
 //思路是 采用虚拟头节点 每次比较是把后一个节点放在前面当首部头结点
        if (head==null) return null;

        ListNode first=new ListNode();

        first.next=head;

        ListNode tt=head;

        while (tt.next!=null){

           ListNode st= tt.next;
           tt.next=st.next;
           st.next=first.next;
           first.next=st;
        }
        return first.next;

}

public ListNode reverseList(ListNode head) {
//思路二 双指针进行转换 per表示前一个节点 cur表示当前节点
//初始情况下 cur为head per为null 
//每完成一次转换 往后移动一位(在这里 需要一个中间过渡 temp)

        ListNode cur=head;
        ListNode per=null;

        while(cur!=null){
            ListNode temp=cur.next;
            cur.next=per;
            per=cur;
            cur=temp;
        }
        return per;

}

public ListNode reverseList(ListNode head) {
 // 思路三 递归 参考双指针方法的思路
       return reverse(head,null);
    }

    public ListNode reverse(ListNode cur,ListNode per){
        //递归终止条件
        if(cur==null) return  per;

        ListNode temp =cur.next;
        cur.next=per;
         return reverse(temp,cur);
    }
}

 个人总结

反转链表的三种方法的大致思路相同,但在编写的过程中,双指针代码无论是思想还是代码量更具有优势。

个人鸡汤

如果难以抉择,就不要抉择。

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值