题目:输入一个链表,输出该链表中倒数第k个结点。
思路:我们首先的想法是取链表中索引为长度-k-1的节点的个数,所以我们需要计算出链表的长度,这样的话就需要设一个计数器循环一遍链表,每循环一遍,计数值加一,取到计数值之后,我们再循环长度-k次,就可以得到倒数第k个节点,
但是这个方法需要循环两遍,效率太低
只循环一遍:我们可以设两个指针pre,after,当pre走K步的时候,让after指向头节点,然后使两个指针同时向后走,当pre走到尾节点的时候,after正好指向第K个节点,因为pre和after之间隔了k-1个节点。
代码:
public ListNode FindKthToTail(ListNode head, int k) {
if (head == null || k <= 0) {
return null;
}
ListNode node1 = head;
ListNode node2 = head;
int i = 1;
while (node1 != null) {
node1 = node1.next;
if (i > k) {
node2 = node2.next;
}
i++;
}
if (k >= i) {
return null;
}
return node2;
}