文章目录
一、题目
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
点击此处跳转题目。
示例:
说明:
- 给定的 k 保证是有效的。
二、C# 题解
先遍历一遍求总结点数 n,再顺序寻找第 n - k + 1 个节点就可以了:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public int KthToLast(ListNode head, int k) {
int n = 0;
ListNode p = head;
// 先遍历一遍求总结点数 n
while (p != null) {
p = p.next;
n++;
}
// 顺序寻找第 n - k + 1 个节点
while (n > k) {
head = head.next;
n--;
}
return head.val;
}
}
- 时间复杂度: O ( n ) O(n) O(n),两次遍历。
- 空间复杂度: O ( 1 ) O(1) O(1)。
当然这么做有点傻,需要两次遍历。因此使用两个间隔为 k 的指针齐头并进,后面的指针到末端,前面的指针指向倒数第 k 个:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public int KthToLast(ListNode head, int k) {
ListNode p = head, q = p; // 双指针
while (k-- > 0) q = q.next; // q 在 p 的后面第 k 个
// p、q 同时前进,q 到终点时,p 指向 倒数第 k 个
while (q != null) {
q = q.next;
p = p.next;
}
return p.val;
}
}
- 时间复杂度: O ( n ) O(n) O(n),一次遍历。
- 空间复杂度: O ( 1 ) O(1) O(1)。