题目:给一个链表,和一个k,表示拿到倒数第k个节点,然后返回。
public ListNode getKthFromEnd(ListNode head, int k)
思路:
1.先遍历一遍获得length再去做。
//方法一:先求出链表长度length再去做
public ListNode getKthFromEnd(ListNode head, int k) {
//处理特殊情况(head为null,k<=0或k>length)
if(head == null || k <= 0){
return null;
}
int length = 0;
//使用p指针,不改变head
ListNode p = head;
while(p != null){
length++;
p = p.next;
}
if(k > length){
return null;
}
//从head处向后走(length - k)个长度
p = head;
int step = length - k;
while(step > 0){
p = p.next;
step--;
}
return p;
}
2.快慢指针。在head处定义一个fast和low,先让fast走k步(在这边判断k是不是大于length),然后fast和low一起走。
由于fast先走k步,然后fast和low一起走(并行)。所以相当于只有fast遍历了一遍,效率高。
/*
方法二:快慢指针。fast先走k步,然后fast和low一起走。
fast先走k个,然后fast,low一起走(并行)。相当于只有fast遍历了一遍,效率高。
*/
public ListNode getKthFromEnd(ListNode head, int k) {
//特殊情况处理(head为null,k<=0,或k>length)
if(head == null || k <= 0){
return null;
}
ListNode fast = head;
ListNode low = head;
int tempStep = k;
//这里换成for也行
while(tempStep > 0 && fast != null){
fast = fast.next;
tempStep--;
}
//说明上面fast为null,k>length了
if(tempStep > 0){
return null;
}
while(fast != null){
fast = fast.next;
low = low.next;
}
return low;
}