题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路1:先遍历一遍,获得长度,然后第二遍得到倒数第k个节点。
public class Solution { public ListNode FindKthToTail(ListNode head,int k) { int length = 0; ListNode node = head; while (node != null) { ++length; node = node.next; } if (k > length) { return null; } node = head; for (int i = 0; i < length - k; ++i) { node = node.next; } return node; } }
思路2:利用栈的性质,在弹栈的时候,可以获得倒数第k个节点。(也可以用数组等其他数据结构存,然后再取)
import java.util.Stack; public class Solution { public ListNode FindKthToTail(ListNode head,int k) { Stack<ListNode> stack=new Stack<ListNode>(); while (head!=null){ stack.push(head); head=head.next; } int len=stack.size(); if(len==0||len<k||k==0){ return null; } ListNode result=stack.pop(); while (result!=null){ k--; if(k==0){ return result; } result=stack.pop(); } return null; } }
思路3:快慢指针,快指针速度和慢指针一样,但是位置上领先k,所以快指针到达尾节点时,慢指针到达倒数第k个节点。
public class Solution { public ListNode FindKthToTail(ListNode head,int k) { ListNode fast=head; ListNode slow=head; for (int i = 0; i <k ; i++) { if(fast==null){ return null; } fast=fast.next; } while(fast!=null){ slow=slow.next; fast=fast.next; } return slow; } }
补充:书上第23题求环的入口节点也是快慢指针,此时快指针速度是慢指针的两倍,相遇则是环的入口