输入一个链表,输出该链表中倒数第k个结点。
该题可以想到有两种思路解答,先分析:题目给的是单链表,单向链表的节点,只有
从前往后的指针而没有从后往前的指针。所以不能从后找到倒数第K个节点
①假设这个链表有N个节点,那么倒数第K个节点就是从头节点开始的第(n-k+1)个节点
但是这种方法需要遍历链表两次,第一次统计出链表中节点的个数,第二次就能找到
倒数第K个节点。
**但第一种不是最优解法,不是我们想要的答案**
②我们应该想到利用双指针解法;即定义两个指针。第一个指针从链表的头指针开始
遍历往前走K-1步,第二个指针保持不变;从第K步开始,第二个指针也开始从链表的头
指针开始遍历。
③由于两个指针的距离保持在K-1;当第一个(走在前面的)指针到达链表的尾节点时,
第二个指针刚好指向倒数第K个节点
详细代码如下:
public ListNode FindKthToTail(ListNode head,int k){
if(head ==null);
return null;
ListNode p1 = head;
while(p1 !=null && k-- > 0)
p1 = p1.next;
if(k > 0 )
return null;
ListNode p2 = head;
while(p1 != null){
p1=p1.next;
p2=p2.next;
}
return p2;
}
一点小总结:使用双指针链表,就是快慢指针类型,当一个指针遍历链表不能解决
问题时,可以考虑使用双指针链表解决,让其中一个指针遍历的速度快一些。