题目描述
实现一种算法,找出单向链表中倒数第 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 是链表的长度。
逐步验算
实际应用
这个函数可以用于解决一些与链表相关的问题,例如:
- 找到链表中倒数第 k 个节点的值:通过调用
findKthFromEnd(head, k)
函数,可以找到链表中倒数第 k 个节点的值。这在一些需要从链表末尾开始操作的场景中非常有用,比如删除倒数第 k 个节点、获取倒数第 k 个节点的前一个节点等。 - 判断链表是否有环:可以使用该函数来检测链表中是否存在环。如果链表中存在环,那么慢指针
slow
和快指针fast
最终会相遇;如果链表中不存在环,那么快指针fast
最终会到达链表的末尾,此时fast
为null
。 - 找到链表中的中间节点:可以使用该函数找到链表的中间节点。通过让快指针
fast
每次移动两个节点,慢指针slow
每次移动一个节点,当快指针fast
到达链表末尾时,慢指针slow
恰好指向链表的中间节点。 - 删除链表的倒数第 k 个节点:可以使用该函数找到链表中倒数第 k 个节点,并删除它。通过找到倒数第 k 个节点的前一个节点,将其
next
指针指向倒数第 k 个节点的下一个节点,即可实现删除。 - 链表反转:可以利用该函数找到链表的倒数第一个节点,并将其作为新的头节点,从而实现链表的反转。
这些是函数的一些实际应用示例,但实际上,该函数可以用于解决更多与链表相关的问题。