本篇文章列举出了新浪面试题中的一个单链表的考题,在接下来的文章中会列举腾讯和百度的单链表面试题作为例子进行讲解。
新浪面试题目为:求单链表中结点的个数(有效结点),以及查找单链表中倒数第k个结点。
题目非常简单,其中求单链表中结点的个数可以通过遍历实现,而查找单链表中的倒数第k个结点的思路如下:
//查找单链表中的倒数第k个结点(新浪面试题)//思路//1.编写一个方法,接收head结点,同时接收一个index//2.index表示的是倒数第index个结点//3.先把链表从头到尾遍历,得到链表的总的长度,调用getLength//4.得到size后,从链表的第一个开始遍历,遍历(size-index)个//5.如果找到返回该结点,否则返回空
思路想好之后,就可以先写求单链表中结点个数的方法,因为这个方法在第二个问题中也能用到:
//方法:获取到单链表的结点的个数(如果是带头结点的,不统计头结点)//head链表的头结点//返回的是有效结点的个数publicstaticintgetLength(HeroNodehead){if(head.next==null){return0;}intlength=0;HeroNodecur=head.next;while(cur!=null){length++;cur=cur.next;//遍历}returnlength;}
其中遍历是通过cur=cur.next这句实现的。写完方法之后,运行一下:
可以正确得到有效的结点个数,我们举的例子就是之前英雄排行的例子,可以看到删除后的链表中只有两个结点,因此得到有效的结点个数为2。
接下来,再写查找倒数第k个结点的代码:
//查找单链表中的倒数第k个结点(新浪面试题)//思路//1.编写一个方法,接收head结点,同时接收一个index//2.index表示的是倒数第index个结点//3.先把链表从头到尾遍历,得到链表的总的长度,调用getLength//4.得到size后,从链表的第一个开始遍历,遍历(size-index)个//5.如果找到返回该结点,否则返回空publicstaticHeroNodefindLastIndexNode(HeroNodehead,intindex){//判断如果链表为空,返回nullif(head.next==null){returnnull;//没有找到}//第一次遍历得到链表的长度(结点个数)intsize=getLength(head);//第二次遍历size-index位置,就是倒数第k个结点//先做一个index的校验if(index=0
indexsize){returnnull;}//定义辅助变量HeroNodecur=head.next;for(inti=0;isize-index;i++){cur=cur.next;}returncur;}
思路如下,运行结果如图所示,输入的是倒数第一个结点,按照上图所示,应该输出吴用以及吴用的信息:
运行结果正确,正确完成题目。
琢磨先生DataBase