單向連結串列中查詢倒數第K個數
阿新 • • 發佈:2019-02-12
問題
單向連結串列如果要找某一元素或者遍歷連結串列,只能從頭節點開始,所以如果我們用普通方法查詢倒數第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)