題目格式post
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { private int count = 0; private ListNode ret; public ListNode FindKthToTail(ListNode head,int k) { if(head == null) return null; FindKthToTail(head.next,k); count ++; if(count == k) ret = head; return ret; } }
解題思路一(比較懶的思路):this
經過遞歸往回推的時候經過一個計數器不斷遞增,若是計數器等於k,那麼咱們就把這個節點保存下來。編碼
源代碼:spa
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { private int count = 0; private ListNode ret; public ListNode FindKthToTail(ListNode head,int k) { if(head == null) return null; FindKthToTail(head.next,k); count ++; if(count == k) ret = head; return ret; } }
這個代碼並非很好,由於爲了保存這個節點,我還額外建立了實例變量,這樣的編碼也只能用於作題。code
解題思路二(不使用遞歸):blog
好比說咱們一共有5個元素,要求倒數第2個元素,那麼其實就是正向的求第4個元素,也就是(5-2+1)個元素,那麼咱們的第一個元素就須要移動3次遞歸
可是對於鏈表咱們沒法知道它一開始有幾個元素,因此能夠用另一種方法。it
咱們能夠使用2個節點,咱們能夠利用後一個節點的移動的次數來決定前一個元素移動的次數。io
仍是上面這個例子。一共有5個元素(但一開始咱們是不知道的),求倒數第2個元素class
源代碼:
/* 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 pre = head; ListNode post = head; if(head == null) return null; if(k <= 0) return null; //求出後一個節點該從第幾個元素開始 for(int i = 0; i < k-1; i++) { post = post.next; if(post == null) return null; } while(post.next != null){ pre = pre.next; post = post.next; } return pre; } }