遇到过一道奇奇怪怪的Java题,就整理出自己的想法,不知道对不对,还望大佬们指导。
题目
给定一个单链表,查找单链表中第 k 个节点元素的值,同时要求使用时间复杂度低的算法实现。
单链表的定义如下:
class ListNode {int val;ListNode next;ListNode(int val){this.val=val;}}
我的想法
这题很迷惑,我的两种思考方向是:
-
Java书上说的是:遍历链表,使用迭代器要比get()快
-
单纯考虑时间复杂度都是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<ListNode> iterator = new Iterator<ListNode>(){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 -> 5ListNode 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
还是不太懂题目的真正含义,还望大佬指点