1.タイトルの説明:
リンクリストを入力し、リンクリストの下からk番目のノードを出力します。
2.問題解決のアイデア:
これも一種の問題です。k番目のノードへのリンクリストのノードの値を見つけてください。最初に2つのヘッドポインタを定義します。
最初のポインタは最初にKステップを実行し、2番目のポインタは
それがどこにあるかを認識しません。最初のポインタがkステップを実行すると、2番目のポインタは最初のポインタに続き、最初のポインタが移動するたびに戻ります。 2番目のポインターも1ステップかかり、
最初のポインターが最後
に到達するまで、2番目のポインターが指す要素がターゲットノードになります。例を挙げて、絵を描き、それを通り抜けて、一目で明確にすることをお勧めします。
3.コードの実装:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
* 1,2,3,4,5
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode FindKthToTail (ListNode pHead, int k) {
// 首先判断头结点是否为空
if(pHead == null){
return null;
}
// 定义两个头结点
/*
第一个指针先走K步,第二个指针原地不懂
然后当第一个指针走了k步后,第二个指针随着第一个指针往后走,第一个个指针每走一步,第二个指针也走一步,直到
第一个指针走到末尾
第二个指针指向的元素就是目标结点
*/
ListNode head1 = pHead;
ListNode head2 = pHead;
// 遍历第一个指针指向的结点
for(int i = 1;i <= k;i++){
// 说明长度不够,小于k
if(head1 == null){
return null;
}
// 长度够了,head1指针往后移动,直到移动到第k个结点
head1 = head1.next;
}
// 当head1指针指向了不是最后一个结点的时候,head1,head2指针一起往后走
while(head1 != null){
head1 = head1.next;
head2 = head2.next;
}
return head2;
}
}