ChatGPT刷力扣面试题02.02返回倒数第 k 个节点

题目描述
实现一种算法,找出单向链表中倒数第 k 个节点 。返回该节点的值 。注意:本题相对原题稍作改动示例:输入: 1->2->3->4->5 和 k = 2输出: 4说明:给定的 k 保证是有效的 。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/kth-node-from-end-of-list-lcci著作权归领扣网络所有 。商业转载请联系官方授权,非商业转载请注明出处 。
开始解题()
要找出单向链表中倒数第 k 个节点,我们可以使用双指针法来解决这个问题 。
首先,我们定义两个指针,一个快指针和一个慢指针,初始时两个指针都指向链表的头节点 。
然后,我们让快指针先向前移动 k 个节点 。
接下来,我们同时移动快指针和慢指针,直到快指针指向链表的末尾节点 。
此时,慢指针所指向的节点就是倒数第 k 个节点 。
最后,我们返回慢指针所指向的节点的值 。
具体的实现如下:
class ListNode:def __init__(self, x):self.val = xself.next = Nonedef findKthFromEnd(head, k):if not head or k <= 0:return Nonefast = headfor _ in range(k):if not fast:return Nonefast = fast.nextslow = headwhile fast:fast = fast.nextslow = slow.nextreturn slow.val
时间复杂度分析: 双指针法只需要遍历链表一次,所以时间复杂度是 O(n),其中 n 是链表的长度 。
逐步验算
实际应用
这个函数可以用于解决一些与链表相关的问题,例如:
找到链表中倒数第 k 个节点的值:通过调用(head, k)函数,可以找到链表中倒数第 k 个节点的值 。这在一些需要从链表末尾开始操作的场景中非常有用,比如删除倒数第 k 个节点、获取倒数第 k 个节点的前一个节点等 。判断链表是否有环:可以使用该函数来检测链表中是否存在环 。如果链表中存在环,那么慢指针slow和快指针fast最终会相遇;如果链表中不存在环,那么快指针fast最终会到达链表的末尾,此时fast为null 。找到链表中的中间节点:可以使用该函数找到链表的中间节点 。通过让快指针fast每次移动两个节点,慢指针slow每次移动一个节点,当快指针fast到达链表末尾时,慢指针slow恰好指向链表的中间节点 。删除链表的倒数第 k 个节点:可以使用该函数找到链表中倒数第 k 个节点,并删除它 。通过找到倒数第 k 个节点的前一个节点,将其next指针指向倒数第 k 个节点的下一个节点,即可实现删除 。链表反转:可以利用该函数找到链表的倒数第一个节点,并将其作为新的头节点,从而实现链表的反转 。
【ChatGPT刷力扣面试题02.02返回倒数第 k 个节点】这些是函数的一些实际应用示例,但实际上,该函数可以用于解决更多与链表相关的问题 。