前言
在我看来就是个花活,其实并不难主要是代码实现的思想。
解决这个问题的一个有效方法是使用“双指针”技术。具体来说,可以设置两个指针,第一个先前进k步,然后两个指针一起前进,直到第一个指针到达链表尾部。此时第二个指针所指向的就是链表的倒数第k个节点。
这是这种方法的具体步骤:
- 初始化两个指针 fast 和 slow,都指向链表的头节点。
- 移动 fast 指针k步。如果在移动过程中 fast 达到链表尾部(即 fast 成为 null,则链表长度小于k,返回一个新的、长度为0的链表(或null,根据题目描述)
- 同时移动 fast 和 slow 指针,直至 fast 指针达到链表尾部。
- 此时 slow 指针所指向的节点就是倒数第k个节点,返回这个节点。
提示:以下是本篇文章正文内容,下面案例可供参考
一、问题:
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
本题牛网连接:牛网连接
二、代码
1.创建链表类:
@Data
class Node {
private int id;
private Node next;
}
2、构建链表
public static Node build(int count ,Node head){
Node currentNode = head;
for (int i = 1; i < count; i++) {
Node nextNode = new Node();
nextNode.setId(i);
currentNode.setNext(nextNode);
currentNode = nextNode;
}
return head;
}
3、具体代码
代码如下(示例):
public static Node findKthToLast(Node head, int k) {
if (head == null || k <= 0) {
// 返回null或长度为0的链表,根据题目要求
return null;
}
Node fast = head;
Node slow = head;
// 移动fast指针k步
for (int i = 0; i < k; i++) {
if (fast == null) {
// 链表长度小于k,返回null或长度为0的链表
return null;
}
fast = fast.getNext();
}
// 移动fast和slow指针
while (fast != null) {
fast = fast.getNext();
slow = slow.getNext();
}
// slow指针指向的就是倒数第k个节点
return slow;
}
4、调用
public static void main(String[] args) {
Node head = new Node();
head.setId(0);
Node build = build(5, head);
System.out.println(build);
Node kthToLast = findKthToLast(build, 3);
System.out.println(kthToLast);
}
总结
还是指针的问题,什么情况下指针怎么移动,要先自己分析然后再去写思路最后代码落地。