📜  通过 N 个节点旋转双向链表(1)

📅  最后修改于: 2023-12-03 15:12:22.851000             🧑  作者: Mango

通过 N 个节点旋转双向链表

双向链表是一种自带前向和后向指针的链表,我们可以在双向链表中非常方便地完成向前或向后遍历的操作。在有些情况下,我们需要对双向链表进行旋转,以此来满足一些运算的需要。

本文将会详细介绍如何通过 N 个节点来旋转双向链表的操作。

问题描述

给定一个双向链表和一个整数 k,将双向链表向右旋转 k 个位置。

示例

示例 1:

输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]
解释:
向右旋转 1 步: [5,1,2,3,4]
向右旋转 2 步: [4,5,1,2,3]

示例 2:

输入: head = [0,1,2], k = 4
输出: [2,0,1]
解释:
向右旋转 1 步: [2,0,1]
向右旋转 2 步: [1,2,0]
向右旋转 3 步: [0,1,2]
向右旋转 4 步: [2,0,1]
解法

根据题目要求,我们需要按照指定的 k 值进行旋转操作。具体操作步骤如下:

  1. 先统计链表长度,并将尾节点指向头节点,形成一个环形链表;
  2. 确定好旋转位置,并断开环形链表,变成单链表;
  3. 找到新链表的尾节点,并将其指向原链表的头部节点。

具体代码如下:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
        self.prev = None


class Solution:
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head or not head.next:  # 链表为空或只有一个结点,不需要旋转,直接返回head
            return head

        n = 1
        old_tail = head
        while old_tail.next:
            old_tail = old_tail.next
            n += 1
        old_tail.next = head  # 构成循环链表
        k %= n
        if k == 0:
            old_tail.next = None
            return head

        new_tail = head
        for _ in range(n - k - 1):
            new_tail = new_tail.next
        new_head = new_tail.next
        new_tail.next = None
        return new_head
总结

本文中我们学习了如何通过 N 个节点旋转双向链表。通过本文的介绍,相信大家可以掌握这个操作了。如果你有更好的解法,可以在评论区留言。