实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
方法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