题目
输入一个链表,输出该链表中倒数第k个节点。(本题从1开始计数,即链表的尾节点是倒数第1个节点)
示例:给定一个链表:1->2->3->4->5和k=2。
返回链表:4->5。
思路1:
先遍历一遍链表,获取链表的长度size,然后再从头开始走(size - k)步,即为所求。
注意判断链表为空和k的合法问题(k > 0 && k <= size)
代码1
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode FindKthToTail (ListNode pHead, int k) {
if(pHead == null || k <= 0) {
return null;
}
ListNode node = pHead;
int size = 0;
while(node != null) {
size++;
node = node.next;
}
if(k > size) {
return null;
}
for(int i = 0; i < size - k; i++) {
pHead = pHead.next;
}
return pHead;
}
}
思路2:快慢指针法
最开始让fast先走k步,此时再让fast和low一起开始向后走,当fast == null时,low节点恰好即为所求。
代码2
import java.util.*;
public class Solution {
public ListNode FindKthToTail (ListNode pHead, int k) {
if(pHead == null || k <= 0) {
return null;
}
ListNode low = pHead, fast = pHead;
//让fast先走k步
for(int i = 0; i < k; i++) {
if(fast == null) {
//此时k > 链表长度size
return null;
}
fast = fast.next;
}
//fast和low一起向后走
while(fast != null) {
low = low.next;
fast = fast.next;
}
return low;
}
}