数据结构与算法从零开始-----------单链表练习(新浪,腾讯面试题)

一.回顾

上一章节我们实现了对水浒英雄排名,其中包括对单链表的增删改查

二单链表练习

2.1小试牛刀

2.1.1要求

求单链表中有效节点的个数

2.1.2思路分析

1)首先我们应该知道,在链表中什么叫做有效节点,即存放数据的节点,所以头节点是不能算作有效节点的.

2)直接遍历所有链表,定义一个count,每得到一个有效数据,count自加,最后返回count,即得到有效节点的个数

2.1.3代码实现

 public static int selectAll(HeroNode head){
        int count = 0;
        HeroNode temp = head.next;
        if (head.next==null){
            return 0;
        }else {
            while (temp!=null){
                temp = temp.next;
                count++;
            }
            return count;

        }
    }

2.1.4结果验证

由代码可知,链表中应该有四个有效节点

完成~正确

2.2新浪面试题

2.2.1要求

查找单链表中的倒数第k个结点 

2.2.2思路分析

1)创建一个方法selectOrder,接受head节点,和k,k表示要寻找的倒数的第k个节点

2)先遍历链表得到链表的长度size,可以通过刚刚完成的查询有效节点的个数方法selectAll完成

3)得到size之后,开始循环,循环(size-k)个即找到要找的倒数第k个节点

4)规定找到直接返回,找不到返回null

2.2.3代码实现

  public static HeroNode selectOrder(HeroNode head,int k){
        HeroNode temp = head.next;
        if (temp ==null){
            return null;
        }else{
            int size = selectAll(head);
            //对k值做判断
            if (k>size||k<=0){
                return null;
            }else {
                for (int i = 0; i < size - k; i++) {
                    temp = temp.next;
                }
                return temp;
            }

        }

    }

2.2.4结果验证

根据我们输入的代码可知,我们要的是倒数第二个节点

正是倒数第二个节点,

试一下,如果k越界会怎么样,按我们写的代码应该会返回null

确实是,至此我们完成了查找倒数第k个节点

2.3腾讯面试题

2.3.1要求

单链表的反转

2.3.2思路分析

1) 先定义一个节点 reverseHead = new HeroNode();

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

3) 原来的链表的head.next = reverseHead.next

2.3.3代码实现

//将链表反转
    public static void roll(HeroNode head){
        //首先判断当前链表是否为空,或者就一个节点,这时直接返回就好
        if (head.next ==null||head.next.next==null){
            return;
        }
        HeroNode curr = head.next;
        HeroNode next = null;//指向当前节点[curr]后的下一个节点
        HeroNode tempHead = new HeroNode(0," "," ");
        while (curr!=null){
            next = curr.next;//先保存当前节点信息
            curr.next=tempHead.next;//
            tempHead.next=curr;
            curr=next;
        }
        head.next = tempHead.next;
    }

2.2.4结果展示

因为用的是addByOrder函数,即会给插入的英雄节点自动排序,所以输出结果应该是4,3,2,1

正确~完成!

三.小结

1)在小试牛刀中,有一点零碎的细节,我们将selectAll函数设置成static静态的并放在mian函数下面了即和main函数是在一个类里面,所以,可以直接调用,但调用需要头参数,而头参数是HeroMange的私有属性,我们又创了一个get方法,调用head,完成调用

2)在新浪的那个题中,可能会忽略掉对k值做判断,而直接做循环,这样的话会越界。在查找倒数第k个节点时,也很好实现,就是两个循环,第一次循环是得到链表的长度size,可以借助selectAll完成,第二个循环循环size-k个也完成了,最后输出节点即可

3)腾讯这个题怎么说呢,挺绕的,一不小心就会被绕进去了,建议观看博客者弄明白等号左边的节点.next和等号右边节点.next的含义,搞懂这两个区别的话,加以画图辅助还是挺好明白的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值