单向链表中查找倒数第K个数

问题

单向链表如果要找某一元素或者遍历链表,只能从头节点开始,所以如果我们用普通方法查找倒数第K个数,要分两步:第一步:先遍历链表中元素的个数,第二步:从头开始遍历,遍历到链表个数-k个数;

用两个指针来快速找到倒数第k个数

package com.tangbaobao.baidu;

import java.time.temporal.Temporal;
import java.util.Scanner;

/**
 * 链表找倒数第k个数
 *
 * @author 唐学俊
 * @create 2018/04/17
 **/

public class FindNumResverseOrder {
    /**
     * 节点内部类
     */
    class Node {
        private Node nextNode;
        private int value;

    }

    /**
     * 设置头节点
     */
    private Node head;

    public static void main(String[] args) {
        FindNumResverseOrder order = new FindNumResverseOrder();
        //添加数据
        order.add(1);
        order.add(2);
        order.add(3);
        order.add(4);
        order.add(5);
        Scanner scanner = new Scanner(System.in);
        System.out.println("你要查找链表中倒数第几个数?");
        int k = scanner.nextInt();
        int num = order.getNum(k);
        System.out.println(num);
    }

    public void add(int i) {
        //定义新节点,并设置值
        Node newNode = new Node();
        newNode.value = i;


        //第一次添加
        if (head == null) {
            head = newNode;
        } else {
            //设置中间节点
            Node temp = head;
            //非第一次添加
            while (temp.nextNode != null) {
                temp = temp.nextNode;
            }
            temp.nextNode = newNode;
        }
    }


    /**
     * 代码说明:没有做越界分析,所有测试用例都基于给定范围
     *
     * @param k
     * @return
     */
    public int getNum(int k) {
        //定义连个指针,开始都指向头节点
        Node nodej = head;
        Node nodei = head;
        //先移动k步
        for (int l = 0; l < k - 1; l++) {
            nodej = nodej.nextNode;
        }
        //i,j同时后移,直到j到达最后一个元素,这是i所指向的元素就是第倒数第k个
        while (nodej.nextNode != null) {
            nodei = nodei.nextNode;
            nodej = nodej.nextNode;
        }
        return nodei.value;
    }
}

时间复杂度:o(n)
空间复杂度:o(1)

猜你喜欢

转载自blog.csdn.net/tangyaya8/article/details/79979246