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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

开始解题(TypeScript)

要找出单向链表中倒数第 k 个节点,我们可以使用双指针法来解决这个问题。

首先,我们定义两个指针,一个快指针和一个慢指针,初始时两个指针都指向链表的头节点。

然后,我们让快指针先向前移动 k 个节点。

接下来,我们同时移动快指针和慢指针,直到快指针指向链表的末尾节点。

此时,慢指针所指向的节点就是倒数第 k 个节点。

最后,我们返回慢指针所指向的节点的值。

具体的实现如下:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def findKthFromEnd(head, k):
    if not head or k <= 0:
        return None
    
    fast = head
    for _ in range(k):
        if not fast:
            return None
        fast = fast.next
    
    slow = head
    while fast:
        fast = fast.next
        slow = slow.next
    
    return slow.val

时间复杂度分析: 双指针法只需要遍历链表一次,所以时间复杂度是 O(n),其中 n 是链表的长度。

逐步验算

实际应用

这个函数可以用于解决一些与链表相关的问题,例如:

  1. 找到链表中倒数第 k 个节点的值:通过调用 findKthFromEnd(head, k) 函数,可以找到链表中倒数第 k 个节点的值。这在一些需要从链表末尾开始操作的场景中非常有用,比如删除倒数第 k 个节点、获取倒数第 k 个节点的前一个节点等。
  2. 判断链表是否有环:可以使用该函数来检测链表中是否存在环。如果链表中存在环,那么慢指针 slow 和快指针 fast 最终会相遇;如果链表中不存在环,那么快指针 fast 最终会到达链表的末尾,此时 fast 为 null
  3. 找到链表中的中间节点:可以使用该函数找到链表的中间节点。通过让快指针 fast 每次移动两个节点,慢指针 slow 每次移动一个节点,当快指针 fast 到达链表末尾时,慢指针 slow 恰好指向链表的中间节点。
  4. 删除链表的倒数第 k 个节点:可以使用该函数找到链表中倒数第 k 个节点,并删除它。通过找到倒数第 k 个节点的前一个节点,将其 next 指针指向倒数第 k 个节点的下一个节点,即可实现删除。
  5. 链表反转:可以利用该函数找到链表的倒数第一个节点,并将其作为新的头节点,从而实现链表的反转。

这些是函数的一些实际应用示例,但实际上,该函数可以用于解决更多与链表相关的问题。

猜你喜欢

转载自blog.csdn.net/qq_39154376/article/details/131886274