题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路
[方法一]
找倒数第 k 个,就是找正数第 n - k + 1 个,需要遍历两遍链表。
需要注意此题 k 可能超过 len
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode dummyNode = head;
int len = 0;
while (head != null) {
len++;
head = head.next;
}
if (k > len) return null;
for (int i = 0; i < len - k; i++) {
dummyNode = dummyNode.next;
}
return dummyNode;
}
}
[方法二]
利用快慢指针,让快指针先走 k - 1 步,然后再一起走,最后当快指针走到尾结点时,慢指针就正好指向倒数第 k 个结点。
需要注意的是代码的鲁棒性,考虑链表为null,k = 0,以及链表中结点数 < k 的情况。
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if (head == null || k == 0) return null;
ListNode fast = head;
ListNode slow = head;
// fast 先走 k - 1步
for (int i = 0; i < k - 1; i++) {
if (fast.next != null)
fast = fast.next;
else
return null;
}
while (fast.next != null) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}