1.代码
1.获取有效值
/**
* 根据头部获取队列的有效值
* @param head
*/
public int getLength(HeroNode head) {
//判断队列是否为空,如果为空的话,就有效值就为0
if (head.next==null) {
return 0;
}
//队列不为空
//标记一个值,来统计,每次可以遍历一个就加1。默认为0
int size=0;
HeroNode cur = head.next;
while (cur != null) {
size++;
//后移
cur=cur.next;
}
return size;
}
测试:
System.out.println("面试题,获取队列的有效值:");
System.out.println(myLinkedList.getLength(myLinkedList.getHead()));
2.获取队列倒数第几个的节点
/**
* 获取队列的倒数第几个节点
* @param head 头结点
* @param lastIndex 倒数第几个
* @return 倒数第几个节点
*/
public HeroNode findLastIndexNode(HeroNode head, int lastIndex) {
HeroNode temp = head.next;
//队列为空,无法找
if (temp==null) {
System.out.println("队列为空,无法查找");
return null;
}
//队列不为空
int size=getLength(head);//队列的长度
//查找的索引值不合理(小于0,获取大于链表的长度)
if (lastIndex<=0||lastIndex>size) {
System.out.println("查找的倒数索引不合理");
return null;
}
HeroNode findNode=null;
for (int i = 0; i < size-lastIndex; i++) {
findNode=temp.next;
temp=temp.next;
}
return findNode;
}
测试:
HeroNode lastIndexNode=myLinkedList.findLastIndexNode(myLinkedList.getHead(),1);
System.out.println(lastIndexNode);
2.讲解
1.获取有效值,其实就是遍历链表,然后进行++,得到有效值(这里不算头节点)
2.获取链表倒数第几个的值。这里要找到对应的值,都要从头遍历到对应位置
在上面的图中。如果要找倒数第一个,那么我们就要遍历到3次找到3;如果是倒数第2个,就要遍历2次找到2;如果是3的话就要遍历1次,找到1。对应值如下(左边表示倒数第几个,右边表示要遍历几次)
可以发现,他们的和都等于固定值(这里是4),可以得到遍历第几个的值。size为长度,lastIndex表示倒数第几个。findNode表示我们想要的节点值
for (int i = 0; i < size-lastIndex; i++) {
findNode=temp.next;
temp=temp.next;
}
3.问题与反思
略