题目描述
输入一个链表,输出该链表中倒数第k个结点。
第一种方法:拿到题目后,首先想到就是构建链表的结构,代码如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
其次,就是选择使用递归的想法来实现,方法也比较简单,不用再考虑其边界等等。
1、设置全局变量length为0;
2、遍历到末尾部分;
3、初始化ListNode为空,直达length和k相同时再给其赋值,否则一直为空。
时间复杂度为log(n)。是不是超简单!
public class Solution {
public int length=0;
public ListNode FindKthToTail(ListNode head,int k) {
ListNode result=null;
if(head!=null)
result=FindKthToTail(head.next,k);
if(length==k) result=head;
length++;
return result;
}
}
另一种方法:首先记录head为temp,head往前进k个节点,然后temp和head一起往前进,至到head为空为止。但这个方法容易出现鲁棒性问题。代码如下 :
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
int n=1;ListNode temp=head;
while(head!=null && n<k){
head=head.next;++n;
}
if(head==null || n!=k) return null;
while(head.next!=null){
temp=temp.next;
head=head.next;
}
return temp;
}
}