链表中倒数第K个结点:快慢指针解决
需要注意的地方是
1) 可能会存在输入的链表大小小于k
2) 输入的k可能小于等于0 - 所以必须限定k大于0
public class _Q15 {
public ListNode FindKthToTail(ListNode head, int k){
if(head == null || k < 1) return null;
ListNode pre = head.next;
ListNode after = head.next;
int count = 0;
while(count++ < k && pre != null){
pre = pre.next;
}
if(count < k) return null; // 链表结点个数小于k
while(pre != null){ // 一直到pre == null的时候,after就是所求
pre = pre.next;
after = after.next;
}
return after;
}
}
测试代码:
public class _Q15Test extends TestCase {
_Q15 K = new _Q15();
public void test(){
ListNode head = new ListNode();
ListNode node1 = new ListNode();
ListNode node2 = new ListNode();
ListNode node3 = new ListNode();
ListNode node4 = new ListNode();
node1.value = 1;
node2.value = 2;
node3.value = 3;
node4.value = 4;
head.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = null;
int k1 = 1;
int k2 = 10;
int k3 = 2;
int k4 = 4;
int k5 = 0;
ListNode result;
/*
* 4
* NULL
* 3
* 1
* NULL
* NULL
*/
result = K.FindKthToTail(head, k1);
if(result != null) System.out.println(result.value); else System.out.println("NULL");
result = K.FindKthToTail(head, k2);
if(result != null) System.out.println(result.value); else System.out.println("NULL");
result = K.FindKthToTail(head, k3);
if(result != null) System.out.println(result.value); else System.out.println("NULL");
result = K.FindKthToTail(head, k4);
if(result != null) System.out.println(result.value); else System.out.println("NULL");
result = K.FindKthToTail(head, k5);
if(result != null) System.out.println(result.value); else System.out.println("NULL");
result = K.FindKthToTail(null, k1);
if(result != null) System.out.println(result.value); else System.out.println("NULL");
}
}