一.回顾
上一章节我们实现了对水浒英雄排名,其中包括对单链表的增删改查
二单链表练习
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的含义,搞懂这两个区别的话,加以画图辅助还是挺好明白的