四、数据结构与算法 (三)单向链表面试:有效值,倒数第几个节点

项目地址:在SingleLinkedListDemo

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.问题与反思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值