1. 程式人生 > >單向連結串列中查詢倒數第K個數

單向連結串列中查詢倒數第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)