📜  旋转链表(1)

📅  最后修改于: 2023-12-03 14:55:05.221000             🧑  作者: Mango

旋转链表

在编程中,有时候需要对链表进行旋转操作。链表是由节点(node)组成的数据结构,每个节点包含数据和指向下一个节点的指针。旋转链表是将链表的最后一个节点移动到链表的头部,在链表上进行循环移动。

问题描述

给定一个链表和一个非负整数 k,要求将链表向右旋转 k 步。也就是说,每向右移动一步,链表的最后一个节点都会变为链表的头部。

旋转链表示例

上图展示了一个向右旋转 4 步的示例。

解决方案

旋转链表涉及到链表节点的移动和重新连接。我们可以先找到链表的倒数第 k+1 个节点,将其作为新的头节点,并将原来的最后一个节点连接到原链表的头节点上。

为了解决这个问题,我们可以采取以下步骤:

  1. 对于链表为空或只有一个节点的情况,直接返回原链表。
  2. 计算链表的长度,并将 k 取模 length,以处理较大的 k
  3. 如果 k 为 0,表示不需要进行旋转,直接返回原链表。
  4. 找到链表的倒数第 k+1 个节点,并将其设置为新的头节点。遍历链表,找到倒数第 k+1 个节点的前一个节点。
  5. 将链表的尾部连接到原链表的头节点上,形成循环链表。
  6. 断开在新链表头节点前的连接,使得链表成为非循环链表。
  7. 返回新的链表头节点。

下面是使用 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 表示链表的长度。

希望以上介绍能够帮助你理解旋转链表的概念和解决方法。