返回

轻松get!乐享算法之旅 —— LeetCode 61 旋转链表

前端

算法分析

LeetCode 61题要求我们旋转一个链表,使链表中的某个节点成为新的头部节点。乍一听,似乎有些复杂,但只要我们理清思路,就能轻松掌握。

首先,我们需要遍历整个链表,计算出链表的长度。这一步至关重要,因为它将帮助我们确定链表需要旋转的次数。

其次,我们将链表最后一个节点和头节点相连,形成一个环形链表。这样做是为了便于我们在旋转链表时进行操作。

第三,我们需要计算出链表实际需要移动的次数。这个次数就是链表长度减去旋转次数的余数。

最后,我们就开始移动链表。具体操作是,我们将链表头节点移动到链表的第(链表长度减去实际需要移动的次数)个节点。然后,我们将链表头节点和链表最后一个节点断开,并将链表头节点指向新链表的头节点。这样,我们就成功地旋转了链表。

代码实现

def rotate_list(head, k):
  """
  Rotates a linked list by k positions.

  Args:
    head: The head of the linked list.
    k: The number of positions to rotate the linked list.

  Returns:
    The head of the rotated linked list.
  """

  # Calculate the length of the linked list.
  length = 0
  current = head
  while current:
    length += 1
    current = current.next

  # Calculate the actual number of positions to rotate the linked list.
  k %= length

  # If k is 0, there is no need to rotate the linked list.
  if k == 0:
    return head

  # Create a circular linked list by connecting the last node to the head node.
  current = head
  while current.next:
    current = current.next
  current.next = head

  # Move the head node to the (length - k)th node.
  for _ in range(length - k - 1):
    head = head.next

  # Break the circular linked list by setting the next node of the new head node to None.
  new_head = head.next
  head.next = None

  # Return the new head node of the rotated linked list.
  return new_head

结语

至此,我们已经成功地解析了LeetCode 61题,并给出了清晰易懂的Python代码实现。希望这篇文章能帮助你深入理解算法,掌握算法实现技巧,不断提升自己的算法能力。