题目描述
输入一个链表,输出该链表中倒数第k个结点。
核心思路:
双指针法,提前设置好两个距离为k的指针,同时移动到尾部,前面的指针就是倒数第k个节点。
复杂度: O(n)
思路很简单,但是对于指针类的编程要注意代码的鲁棒性,在任何输入都不能使得代码崩溃。以下三点尤其要注意:
- 输入的head为空指针,要避免滴啊发访问空指针。
- 输入的链表节点总数少于k,前置指针需要先移动k-1步,会发生空指针访问导致程序崩溃。
- 输入的参数k为0,此时k-1就变成了-1,因此要判断k=0是一个非法输入。
以下为具体解答:
public ListNode FindKthToTail(ListNode head,int k) {
if (k == 0 || head == null) {
return null;
}
ListNode cur = head;
ListNode ahead = head;
for (int i = 0; i < k - 1; i++) {
if (ahead.next == null) {
return null;
}
ahead = ahead.next;
}
while (ahead.next != null) {
cur = cur.next;
ahead = ahead.next;
}
return cur;
}