实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
- 给定的 k 保证是有效的。
分析:
方法1:朴素解法
这道题最简单粗暴的方式就是用List集合存储每一个节点,然后再返回倒数第 k 个节点的值即可。
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int kthToLast(ListNode head, int k) {
//创建栈
List<ListNode> list = new ArrayList<>();
//遍历,存储
while(head != null){
list.add(head);
head = head.next;
}
//返回倒数第k个节点的值
return list.get(list.size()-k).val;
}
}
方法2:快慢指针
这种题一般考验的都是在原链表上的修改。我们可以定义快慢指针,慢指针比快指针少遍历 k 个节点,当快指针遍历完成后,慢指针一定指向倒数第 k 个节点,返回该值即可。
时间复杂度:O(n)
空间复杂度:O(1)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int kthToLast(ListNode head, int k) {
//创建快慢指针
ListNode slow = head, fast = head;
//让快指针先走 k 个节点
while(k-- > 0){
fast = fast.next;
}
//双指针同时遍历,直到快指针遍历完成
while(fast != null){
slow = slow.next;
fast = fast.next;
}
//返回慢指针的值
return slow.val;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci