Java题:查找单链表中第 k 个节点元素的值

遇到过一道奇奇怪怪的Java题,就整理出自己的想法,不知道对不对,还望大佬们指导。

题目

给定一个单链表,查找单链表中第 k 个节点元素的值,同时要求使用时间复杂度低的算法实现。

单链表的定义如下:

class ListNode {

    int val;

    ListNode next;

    ListNode(int val){

        this.val=val;

    }
    
}

我的想法

这题很迷惑,我的两种思考方向是:

  1. Java书上说的是:遍历链表,使用迭代器要比get()快
    Java题:查找单链表中第 k 个节点元素的值_第1张图片

  2. 单纯考虑时间复杂度都是O(n)。但是快慢指针(跳表) 会不会更好一点呢?我不确定

总之就是非常迷惑。

我的代码

快慢指针、指针、迭代器 三种写法

import java.util.Iterator;

class ListNode {
	int val;
	ListNode next;

	ListNode(int val) {
		this.val = val;
	}
}

public class List {
	
//	快慢指针
	public static int findKthNode(ListNode head, int k) {
	    ListNode fast = head;
	    for (int i = 0; i < k - 1; i++) {
	        fast = fast.next;
	        if (fast == null) {
	            return -1; // 返回 -1 表示 链表长度小于k
	        }
	    }
	    ListNode slow = head;
	    while (fast.next != null) {
	        fast = fast.next;
	        slow = slow.next;
	    }
	    return slow.val;
	}
	
//	指针
	public static int findKthNode1(ListNode head, int k) {
	    ListNode current = head;
	    int count = 1; // 记录迭代的次数,从1开始

	    while (current != null && count < k) {
	        current = current.next;
	        count++;
	    }

	    if (current == null) {
	        return -1; // 返回 -1 表示 链表长度小于k
	    }

	    return current.val;
	}

//	迭代器
	public static int findKthNode2(ListNode head, int k) {
		Iterator iterator = new Iterator(){
	        ListNode current = head;
	        public boolean hasNext() {
	            return current != null;
	        }

	        public ListNode next() {
	            ListNode node = current;
	            current = current.next;
	            return node;
	        }

	        public void remove() {
	            throw new UnsupportedOperationException("Unsupported operation: remove");
	        }
	    };
	    
		ListNode target = null;
	    int count = 0;
	    while (iterator.hasNext()) {
	        ListNode node = iterator.next();
	        count++;
	        if (count == k) {
	            target = node;
	            break;
	        }
	    }

	    if (target == null) {
	    	return -1; // 返回 -1 表示 链表长度小于k
	    }

	    return target.val;
	}
	
    public static void main(String[] args) {
    	// 创建一个示例链表:1 -> 2 -> 3 -> 4 -> 5
        ListNode head = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        head.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;

        // 创建一个实例对象
        Main main = new Main();

        // 测试查找第 k 个节点元素的值
        int k = 3;
        int result1 = findKthNode(head, k); // 快慢指针
        int result2 = findKthNode1(head, k); // 指针
        int result3 = findKthNode2(head, k); // 迭代器
        System.out.println("快慢指针实现 :第 " + k + " 个节点的值为:" + result1);
        System.out.println("指针实现 :第 " + k + " 个节点的值为:" + result1);
        System.out.println("迭代器实现 :第 " + k + " 个节点的值为:" + result1);
    }
}

输出

快慢指针实现 :第 3 个节点的值为:3
指针实现 :第 3 个节点的值为:3
迭代器实现 :第 3 个节点的值为:3

还是不太懂题目的真正含义,还望大佬指点

你可能感兴趣的:(java,算法,笔记,学习)