要求:输入一个链表,输出该链表中倒数第k个结点。
思路:使用快慢(双)指针,准备两个指针A和B,A指针指向头结点,A右移K-1步,此时将B指针指向头结点。A继续右移,B也跟着右移,直到A 指针指向尾结点,此时,B指针所指向的结点就是链表中倒数的第K个结点。
注意:代码的鲁棒性,需要注意几个可能让代码奔溃的细节。1、如果输入的链表头为空,则直接返回空。2、 如果输入的k是0,则直接返回空。3、如果链表结点数少于K个数,则直接返回空。
public class L23_FindKthToTail {
public static ListNode2 FindKthToTail(ListNode2 ListHead, int k){
// 细节1和2
if(ListHead == null || k ==0){
return null;
}
// 创建两个指针A和B
ListNode2 A = ListHead;
ListNode2 B = null;
for(int i=0 ; i<k-1;i++){
// 将A 指针指向第K位
if(A.next != null){
A = A.next;
}else{
// 细节3
// 如果结点数少于K位,直接返回空
return null;
}
}
// 此时A指向了链表的第k位
// 将B指向头结点
B = ListHead;
// 直到A指向了尾结点
while(A.next!=null){
A = A.next;
B = B.next;
}
return B;
}
public static void main(String[] args) {
List2 list = new List2();
list.addNode(1);
list.addNode(2);
list.addNode(3);
list.addNode(4);
list.addNode(5);
list.addNode(6);
int c = FindKthToTail(list.head,3).value;
System.out.println("链表中倒数第3个数是:"+c);
}
}
网友评论