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

面试题专栏

文章目录

  • 一、问题描述:
  • 二、解决方案
    • 1. 双遍历
    • 2. 双指针


一、问题描述:

      新浪面试题:查找单链表中倒数第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个节点,先将两个指针指向头节点:

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


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

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

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


查找单链表中的倒数第k个节点-Java数据结构和算法_第3张图片
可以看到,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指针指向的位置就是我们要找的节点
}

你可能感兴趣的:(Java数据结构和算法学习,面试题,链表,算法,双指针,单链表)