LeetCode 面试题 02.02. 返回倒数第 k 个节点 【Kth Node From End of List LCCI】

       互联网行业的小白,写博客的目的是为了记录自己的学习过程、对自己学习中所犯的错误做一个总结。由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!

python题解

题目描述

题目传送门:返回倒数第 k 个节点

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

说明:

给定的 k 保证是有效的。

题解

给出一个长度未知的链表,如何找到链表中倒数第n个结点? **最容易想到的当然是:**先从头到尾遍历链表,统计出链表的总长度,从而计算出倒数第n个结点相当于正数第几个结点。

比如链表总长度是10,倒数第3个结点就相当于正数第8个结点。然后从头遍历链表,遍历到第8个结点,就可得到结果。

AC代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def kthToLast(self, head: ListNode, k: int) -> int:
        cur = head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        cur = head
        for i in range(1, count + 1):
            if i == count - k + 1:
                return cur.val
            cur = cur.next

但是这种方法需要经过两次遍历才能得到结果,如果只用一次遍历,是否可以得到结果?

当然是可以的啦

首先,我们创建两个指针p1p2p1指向链表的头结点,p2指向链表的正数第n个结点 。

接下来,我们让指针p1p2同时循环右移,每次右移一步,直到指针p2移动到链表的末尾。

在这里插入图片描述

此时,由于p2指向链表的尾结点,且p1p2的距离是n-1,因此p1所指的结点就是我们要寻找的链表倒数第n个结点。

显然,这个方法从头到尾只需要对链表做一次遍历,而且仅仅使用了两个指针,算法的空间复杂度是O(1)

AC代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def kthToLast(self, head: ListNode, k: int) -> int:
        p1 = head
        p2 = head
        # 把p2指针移动到正数第n个结点
        for i in range(k - 1):
            p2 = p2.next
        # p1和p2一起右移,直到p2指向链表尾结点
        while p2.next is not None:
            p1 = p1.next
            p2 = p2.next
        return p1.val

在这里插入图片描述

码字不易,您的支持就是我坚持下去的动力,一起加油哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值