查找单链表中的倒数第k个节点-Java数据结构和算法

本文介绍了如何在单链表中找到倒数第k个节点,提供了两种解决方案:双遍历和双指针法。双遍历方法首先获取链表的总长度,然后从头节点开始遍历找到目标节点;双指针法则通过两个指针同步移动,先让一个指针提前移动k步,然后两个指针一起移动直到前一个指针到达末尾,后一个指针即为所求节点。
摘要由CSDN通过智能技术生成
面试题专栏


一、问题描述:

      新浪面试题:查找单链表中倒数第k个节点,输出节点信息即可。


二、解决方案

1. 双遍历

1. 编写一个方法, 接收head节点,同时接收一个index
2. index表示 倒数第index个节点;
3. 先把链表从头到尾遍历,得到链表的总长度getLength();
4. 得到size后,从链表的第一个开始遍历(size - index)次就可以得到

代码如下:

//这里是得到链表长度(有效数据个数)的方法(后面用到):
public static int getLength(HeroNode head){

    int len = 0;

    if(head.next == null){
        return 0;
    }
    HeroNode p = head.next;
    while(p != null){
        p = p.next;
        len++;
    }
    return len;
}
//下面是代码:
public static HeroNode findLastIndexNode(HeroNode head , int index){
    if(head.next == null){
        System.out.println("链表为空");
        return null;
    }

    //第一遍便利得到长度
    int length = getLength(head);//这是个方法,代码在上方

    if(index <= 0 || (index > length)){
        System.out.println("下标错误...");
        return null;
    }

    HeroNode p = head.next;
    //第二次遍历得到第index处的节点
    for(int i = 0 ; i < length - index ; i++){//(长度-index)就是正数的个数
        p = p.next;
    }
    return p;
}

2. 双指针

1. 定义两个指针front 和 rear同时指向头结点;
2. 接收head指针 和 index(表示要找倒数第index节点)
3. 先让front向后移动index次;
4. 两个指针同时移动,直到front节点指向空节点(最后一个节点的下一个位置)的时候,rear指向的就是我们要找的节点

比如我们要找下图倒数第4个节点,先将两个指针指向头节点:

在这里插入图片描述


然后将B先移动 index = 4个节点,效果如下图:

在这里插入图片描述

最后同时移动A和B,直到B指向空节点(最后一个节点的下一个位置):


在这里插入图片描述
可以看到,A的指向刚好就是倒数第4个节点。

代码如下:

public static HeroNode findLastIndexNode2(HeroNode head , int index){
    HeroNode front = head;
    HeroNode rear = head;
    for(int i = 0 ; i < index ; i++){//先将front指针移动index次
        if(front == null){//链表长度小于index(数据异常)
            System.out.println("下标错误, 链表长度没有那么长...");
            return null;
        }
        front = front.next;//移动操作
    }
    while(front != null){//两个指针同时移动,直到front为空
        front = front.next;//移动front指针
        rear = rear.next;//移动rear指针
    }
    return rear;//最后移动完成的rear指针指向的位置就是我们要找的节点
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值