题目描述:
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof
题解一:双指针
解题思路:双指针。
先让 p 移动 k 次,然后 p 和 q 一起移动,直到 p 为 null 为止。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
// q 是要返回的ListNode
ListNode p = head,q = head;
// 首先让 p 移动 k 次
while(k-- > 0) {
// 排除链表长度不足 k 的情况
if (p == null)
return null;
p = p.next;
}
// p 和 q 一起移动到最后
while (p != null) {
p = p.next;
q = q.next;
}
return q;
}
}
题解二:递归
解题思路:递归。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
int num = 0;
public ListNode getKthFromEnd(ListNode head, int k) {
// 终止条件
if (head == null)
return null;
// 递归调用
ListNode node = getKthFromEnd(head.next, k);
num++;
// 逻辑代码
// 如果num<k,表示还没有找到倒数第k个节点
if (num < k)
return null;
// num==k,表示当前的形参head就是要找的节点将它返回
else if (num == k)
return head;
// num>k,表示目前已经找到倒数第k个节点了,保存在node中,所以返回node
else
return node;
}
}
因为 num < k 的时候 node 的值就是 null,所以可以将 num < k 和 num > k 合并起来。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
int num = 0;
public ListNode getKthFromEnd(ListNode head, int k) {
// 终止条件
if (head == null)
return null;
// 递归调用
ListNode node = getKthFromEnd(head.next, k);
num++;
// 逻辑代码
if (num == k)
return head;
return node;
}
}