返回倒数第 k 个节点
难度:
标签:
题目描述
Implement an algorithm to find the kth to last element of a singly linked list. Return the value of the element.
Note: This problem is slightly different from the original one in the book.
Example:
Input: 1->2->3->4->5 和 k = 2 Output: 4
Note:
k is always valid.
代码结果
运行时间: 44 ms, 内存: 14.9 MB
/*
* 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
*
* 思路:
* 1. 将链表转换为一个列表。
* 2. 使用Java Stream API来处理列表并找到倒数第k个节点。
*/
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Solution {
public int getKthFromEnd(ListNode head, int k) {
List<ListNode> list = new ArrayList<>();
ListNode current = head;
// 将链表转换为列表
while (current != null) {
list.add(current);
current = current.next;
}
// 使用Java Stream API找到倒数第k个节点
return list.stream()
.collect(Collectors.toList())
.get(list.size() - k)
.val;
}
}
解释
方法:
此题解采用了双指针方法(快慢指针)。首先,两个指针 f(快指针)和 s(慢指针)都指向链表的头节点 head。然后,快指针 f 先向前移动 k 步。这样,快慢指针之间就保持了 k 个节点的间隔。接着,快慢指针同时向前移动,直到快指针 f 指向链表的末尾(即 f 为 None)。此时,慢指针 s 指向的就是链表中的倒数第 k 个节点。返回该节点的值即可。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在双指针方法中,为什么快指针先移动k步可以确保慢指针最终指向倒数第k个节点?
▷🦆
如果快指针在移动k步过程中遇到链表结尾(比如k大于链表长度),这种情况下该如何处理?
▷🦆
为什么在快指针到达链表末尾时,慢指针恰好指向倒数第k个节点?能否详细解释其中的逻辑关系?
▷