小白试水——leetcode腾讯题库

编程入门 行业动态 更新时间:2024-10-09 18:16:59

小白试水——leetcode<a href=https://www.elefans.com/category/jswz/34/1770070.html style=腾讯题库"/>

小白试水——leetcode腾讯题库

题目61:旋转链表

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

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

解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL

示例 2:

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL

解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL

方法 1:

直觉

链表中的点已经相连,一次旋转操作意味着:

先将链表闭合成环
找到相应的位置断开这个环,确定新的链表头和链表尾

新的链表头在哪里?

在位置 n-k 处,其中 n 是链表中点的个数,新的链表尾就在头的前面,位于位置 n-k-1。

我们这里假设 k < n

如果 k >= n 怎么处理?

k 可以被写成 k = (k // n) * n + k % n 两者加和的形式,其中前面的部分不影响最终的结果,因此只需要考虑 k%n 的部分,这个值一定比 n 小。

算法

算法实现很直接:

找到旧的尾部并将其与链表头相连 old_tail.next = head,整个链表闭合成环,同时计算出链表的长度 n。
找到新的尾部,第 (n - k % n - 1) 个节点 ,新的链表头是第 (n - k % n) 个节点。
断开环 new_tail.next = None,并返回新的链表头 new_head。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution(object):def rotateRight(self, head, k):""":type head: ListNode:type k: int:rtype: ListNode"""# 特殊情况if not head or not head.next or not k:return head# 形成闭环链表old_tail = headn = 1while old_tail.next:old_tail = old_tail.nextn += 1old_tail.next = head# 找到新的链尾和链头位置new_tail = headfor i in range(n - k % n - 1):new_tail = new_tail.nextnew_head = new_tail.next# 断开链表闭环new_tail.next = Nonereturn new_head

这道题难点,就是如何找到那个旋转点?

比如示例1:1->2->3->4->5->NULL, k = 2 ,我们要找到3这个值,只要把它下一位为空,将下面一段链表和它这段链表连接起来就行了!

按照题目的意思是向右移动2位,换句话说,以3作为链表头,把它前面的链表连在它后面!现在问题就是如何找3,我们发现链表的个数-k就是从链表头到3位置。

还有一个问题,就是如果 k = 6 其实就是相等于 k=1;所以我们要防止循环。

最终就成为:

  1. 求链表长度
  2. 找 n - n % k 的位置
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def rotateRight(self, head, k):if not head or not head.next:return head# 链表个数n = 0p = headwhile p:n += 1p = p.nextk = n - k % np = head# 找前一段链表while k > 1:p = p.nextk -= 1head1 = p.nextif not head1:return head#前一段链表最后至空p.next = Nonep = head1# 后一段链表和前一段链表连接起来while p.next:p = p.nextp.next = headreturn head1
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def rotateRight(self, head,k):if not head or not head.next or not k:return headn = 0l = ListNode(0)l.next = headp1 = lp2 = l# 计算个数while p1.next:n += 1p1 = p1.next#print(n)# 找前一段链表k = n - k % n#print(k)while k :p2 = p2.nextk -= 1# 连接p1.next = l.nextl.next = p2.nextp2.next = Nonereturn l.next

学习代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:def rotateRight(self, head: ListNode, k: int) -> ListNode:l = []while head: l[len(l):], head = [head], head.nextif l: l[-1].next, l[-1 - k % len(l)].next = l[0], Nonereturn l[- k % len(l)] if l else None

更多推荐

小白试水——leetcode腾讯题库

本文发布于:2024-03-04 13:20:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1709373.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:腾讯   题库   试水   leetcode

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!