题目:输入一个链表,需要输入倒数第k个节点
常规思路:遍历两遍链表,第一遍找出链表节点个数,第二遍找到目标节点
如果只允许遍历一次链表呢
思路二:很显然,遍历一次如果使用一个指针是没有办法解决了,这时候可以采样双指针的方法,也就是快慢指针,让快指针先走k-1步,再两个指针一起走,由于两者的间距是k,所以当快指针走到结尾处的时候慢指针刚好在倒数第k个位置,也就是链表的到是第k个节点
//查找链表倒数第k个节点
public Node findLastKFromend(Node head, int k){
if (head == null || k == 0 || k > length(head))return null;
Node header = head;
Node behind = header; //后出发的指针
Node pre = header; //先出发的指针
//将先行节点移动k-1步
for (int i = 0; i < k - 1; i ++){
pre = pre.next;
}
//查找到倒数第k个节点
while (pre != null && pre.next != null){
pre = pre.next;
behind = behind.next;
}
return behind;
}
举一反三:查找链表的中间节点,也是采用双指针,快指针每次都两步,慢指针每次走一步,当快指针到结尾的时候,慢指针刚好在中间节点处
==tips:关于链表的查找,要时刻注意效率,从头到尾一步一步找肯定是最慢的,在必要的时候考虑双指针,会快很多。==