问题
单向链表如果要找某一元素或者遍历链表,只能从头节点开始,所以如果我们用普通方法查找倒数第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)