互联网行业的小白,写博客的目的是为了记录自己的学习过程、对自己学习中所犯的错误做一个总结。由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!
题目描述
题目传送门:返回倒数第 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
但是这种方法需要经过两次遍历才能得到结果,如果只用一次遍历,是否可以得到结果?
当然是可以的啦
首先,我们创建两个指针p1
和p2
,p1
指向链表的头结点,p2
指向链表的正数第n
个结点 。
接下来,我们让指针p1
和p2
同时循环右移,每次右移一步,直到指针p2
移动到链表的末尾。
此时,由于p2
指向链表的尾结点,且p1
和p2
的距离是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
码字不易,您的
支持
就是我坚持
下去的动力,一起加油哦。