链表中倒数最后k个结点-使用双指针来解决
题目:
解题思路:
- 定义两个指针:
-
第一个指针 表示要返回的k个节点的第一个节点,该节点可被称作结果节点,即该题的结果
-
第二个指针,表示要要返回的k个节点的最后一个节点,该节点可被称作探索节点
-
- 一开始先让 探索节点 跑(K-1)次即到k个节点中的最后一个,若该链表跑不了7次,则表示该链表返回不了K个节点
- 此时保证了从结果节点到探索节点一共有7个元素,然后让探索节点,结果节点同时跑,当探索节点的next为null时,此时探索节点表示k个最后一个,结果节点表示k个的第一个
- 最后返回结果节点
- 因此该题的时间复杂为O(n),空间复杂度为O(1)
代码
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode FindKthToTail (ListNode pHead, int k) {
//临界情况
if(pHead == null) return null;
if(k == 0) return null;
//定义两个指针:第一个指针 表示要返回的k个节点的第一个节点,该节点可被称作结果节点,即该题的结果
// 第二个指针,表示要要返回的k个节点的最后一个节点,该节点可被称作探索节点
//一开始先让 探索节点 跑(K-1)次即到k个节点中的最后一个,若该链表跑不了7次,则表示该链表返回不了K个节点
//然后让探索节点,结果节点同时跑,当探索节点的next为null时,此时探索节点表示k个最后一个,结果节点表示k个的第一个
//最后返回结果节点
//因此该题的时间复杂为O(n),空间复杂度为O(1)
ListNode resultNode = pHead;
ListNode exploreNde = findStartExploreNode(resultNode, k);
//说明该链表没有7个节点
if (exploreNde == null) return null;
//结果节点和探索节点同时跑,直至探索节点的next位null时,返回结果节点
while (exploreNde.next != null) {
resultNode = resultNode.next;
exploreNde = exploreNde.next;
}
return resultNode;
}
private ListNode findStartExploreNode(ListNode resultNode, int k) {
ListNode exploreNde = resultNode;
//循环k-1次,找到k个节点的最后一个节点的位置
for (int i = 0; i < (k - 1); i++ ) {
if (exploreNde == null) return null;
exploreNde = exploreNde.next;
}
return exploreNde;
}
}