输入一个链表,输出该链表中倒数第k个结点。
思路一:
要求倒数第k个结点,那我们首先想到的肯定是求出此链表的长度len,求出长度len后,倒数第k个结点就是头结点往后遍历len-k个结点。
1)引用p1指向头结点
2)p1像后遍历len-k个结点
public class FindKthToTail {
//找到链表中的倒数第k个结点
//1.求得链表长度len
//2.创建一个新的引用指向head
//3.head遍历len-k个结点得到的就是倒数第k个结点
public static Node FindKthToTail(Node head,int k){
int len = getLength(head);
if(len < k){
return null;
}
int steps = len-k;
Node result = head;
for(int i = 0;i<steps;i++){
result = result.next;
}
return result;
}
public static int getLength(Node head){
int len = 0;
for(Node cur = head;cur != null;cur = cur.next){
len++;
}
return len;
}
思路二:
1.创建俩个结点,让第一个引用先往后遍历k个,然后和第二个一起往后遍历
2.当第一个引用为空时,第二个引用所指向的为倒数第k个结点
public class FindKthToTail {
//找到链表中的倒数第k个结点
//1.创建俩个结点,让第一个引用先往后遍历k个,然后和第二个一起往后遍历
//2.当第一个引用为空时,第二个引用所指向的为倒数第k个结点
public static Node findKthToTail(Node head,int k){
Node p1 = head;
Node p2 = head;
for(int i = 0;i<k;i++){
if(p1 == null){
return null;
}
p1 = p1.next;
}
while(p1 != null){
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
public static void main(String[] args) {
Node head = new Node(1);
head.next = new Node(3);
head.next.next = new Node(4);
head.next.next.next = new Node(9);
head.next.next.next.next = new Node(12);
System.out.println(findKthToTail(head,2).val);
}
}