📅  最后修改于: 2023-12-03 14:55:05.221000             🧑  作者: Mango
在编程中,有时候需要对链表进行旋转操作。链表是由节点(node)组成的数据结构,每个节点包含数据和指向下一个节点的指针。旋转链表是将链表的最后一个节点移动到链表的头部,在链表上进行循环移动。
给定一个链表和一个非负整数 k
,要求将链表向右旋转 k
步。也就是说,每向右移动一步,链表的最后一个节点都会变为链表的头部。
上图展示了一个向右旋转 4 步的示例。
旋转链表涉及到链表节点的移动和重新连接。我们可以先找到链表的倒数第 k+1
个节点,将其作为新的头节点,并将原来的最后一个节点连接到原链表的头节点上。
为了解决这个问题,我们可以采取以下步骤:
k
取模 length
,以处理较大的 k
。k
为 0,表示不需要进行旋转,直接返回原链表。k+1
个节点,并将其设置为新的头节点。遍历链表,找到倒数第 k+1
个节点的前一个节点。下面是使用 Python 实现的代码片段:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def rotateRight(head, k):
# 对于链表为空或只有一个节点的情况,直接返回原链表
if not head or not head.next:
return head
# 计算链表的长度
length = 1
tail = head
while tail.next:
tail = tail.next
length += 1
# 将 k 取模 length 处理较大的 k
k = k % length
# 如果 k 为 0,表示不需要进行旋转,直接返回原链表
if k == 0:
return head
# 找到链表的倒数第 k+1 个节点,并将其设置为新的头节点
count = 0
curr = head
while count < length - k - 1:
curr = curr.next
count += 1
new_head = curr.next
curr.next = None
# 将链表的尾部连接到原链表的头节点上,形成循环链表
tail.next = head
# 断开在新链表头节点前的连接,使得链表成为非循环链表
return new_head
这段代码使用了两次遍历链表的方式解决了问题,时间复杂度为 O(n)。其中 n
表示链表的长度。
希望以上介绍能够帮助你理解旋转链表的概念和解决方法。