每日算法(1)之单链表

1.测试链表中有效节点的个数

这道算法题的思路很简单:设置一个变量记录有效节点的个数,通过在while循环来实现

java 复制代码
public static int getLength(HeroNode head){
        if(head.next==null){//空链表
            return 0;
        }
        int length=0;
        //定义一个辅助的变量,这里我们没有统计头节点
        HeroNode cur=head.next;
        while(cur!=null){
                length++;
                cur=cur.next;//遍历链表
        }
        return length;
    }

2.查找单链表中的倒数第k个节点[新浪面试题]

复制代码
思路
1.编写一个方法,接受头结点head,同时接收一个index
2.index表示是倒数第index个节点
3.先把链表从头到尾遍历一遍,得到链表的总长度getLength(不含头结点)
4.得到size后,我们从链表的第一个开始遍历(size-index)个,就可以得到
5.如果找到就返回该节点,否则返回null

这里的思路其实就是将倒数转换成正数,寻找其中的规律

假设:我们现在有五个数分别为:1,2,3,4,5 我们要找倒数第一位数5,对应正数第五位:而我们 从1到5遍历次数为4;

倒数第二位数4,对应正数第四位:从1到4遍历次数为3;

倒数第三位数3,对应正数第三位: 从1到3遍历次数为2;

即数学表达式为:遍历次数=size-index

java 复制代码
public static HeroNode findLastIndexNode(HeroNode head,int index){
        //如果链表为空,返回null
        if(head.next==null){
            return null;//没有找到
        }
        //第一次遍历得到链表的总长度(有效节点个数)
        int size=getLength(head);
        //第二次遍历 size-index位置,就是我们倒数第k个节点
        //先对index进行一个判断
        if(index<=0||index>size){
            return null;
        }
        //定义辅助变量,for循环到倒数的index
        HeroNode cur=head.next;
        for(int i=0;i<size-index;i++){
            cur=cur.next;
        }
        return cur;
    }

3.单链表的反转[腾讯面试题]

思路图解

思路: 1.我们需要创建一个新的头节点

2.从头到尾遍历原来的链表,每遍历一个边取出一个,将其放在新的链表reverseHead的最前端

3.将所有节点添加到reverseHead这个头节点后,再head.next=reverseHead.next,将rev后面跟着的节点都放在head这个原来的头节点上,便完成反转

java 复制代码
public static void reverseList(HeroNode head){
        //如果当前的链表为空,或者只有一个节点,无需反转,直接返回
        if(head.next==null||head.next.next==null){
            return ;
        }
        HeroNode reverseHead=new HeroNode(0,"","");
        HeroNode cur=head.next;
        HeroNode next=null;//指向当前节点[cur]的下一个节点
        //遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端
        while(cur!=null){
         next=cur.next;//先暂时保存当前节点的下一个节点,因为后面这个节点就在新的链表里面,下一个节点就成为我们移动的对象
         cur.next=reverseHead.next;//将cur的下一个节点指向新的链表的最前端
         reverseHead.next=cur;//cur后移
         cur=next;
        }
        //将head.next指向reverseHead.next,实现单链表的反转
        head.next=reverseHead.next;
    }

4.从头到尾打印单链表[百度面试题]

因为反转遍历的方法会破坏单链表的原始结构,所以这里选择用栈的特性先进后出完成这道题

java 复制代码
public static void reversePrint(HeroNode head){
        if(head.next==null){
            return;//空链表不能打印
        }
        //创建一个栈,将各个节点压入栈
        Stack<HeroNode> stack=new Stack<>();
        HeroNode cur=head.next;
        while(cur!=null){
            stack.push(cur);
            cur=cur.next;
        }
        //将栈中的节点进行打印,pop出栈
        while(stack.size()>0){
            System.out.println(stack.pop());//stack的特点先进后出
        }
    }
相关推荐
1104.北光c°23 分钟前
滑动窗口HotKey探测机制:让你的缓存TTL更智能
java·开发语言·笔记·程序人生·算法·滑动窗口·hotkey
仰泳的熊猫4 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码8 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发8 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre9 小时前
22 括号生成
算法·深度优先
努力也学不会java10 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎10 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan10 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业11 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机