问题描述
只进行一次遍历,找到链表中倒数第k个结点
解法思路
定义2个指针,先让第一个指针走k-1步,第二个指针才开始走,当第一个指针指向链表尾部的时候,第一个指针就指向倒数第k个节点
public class FindKthToTail {
/**
* 创建listNode节点
*/
private static class ListNode{
int val;
ListNode next=null;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
}
public FindKthToTail() {
}
/**
*
* @param head
* @param k
* @return
* 找到输入一个链表,输出该链表中倒数第k个结点
* 链表只遍历一次
*/
public static ListNode FindKthToTail(ListNode head, int k) {
//鲁棒性考虑
if (head==null||k==0){ //输入空的情况
return null;
}
//定义两个指针
ListNode first=head;
ListNode second=head;
//先让第一个指针走k-1次
for (int i=0;i<k-1;i++){
if(first.next!=null){
first=first.next;
System.out.println("firsrt:"+first.val);
}else {
return null; //如果输入的k值太大,比如求倒数第五个节点 链表长度为4
}
}
while (first.next!=null){
//然后两个指针同时后走,当第一个指针走到尾的时候,第二个指针刚好就再k上面
first=first.next;
second=second.next;
}
System.out.println("result:"+second.val);
return second;
}
public static void main(String[] args) {
ListNode node=new ListNode(1);
node.next=new ListNode(2);
node.next.next=new ListNode(3);
node.next.next.next=new ListNode(4);
node.next.next.next.next=new ListNode(5);
node.next.next.next.next.next=new ListNode(6);
ListNode r=FindKthToTail(node,5);
}
}
网友评论