Python 数据结构之旋转链表

Python 数据结构之旋转链表

简介

在进行链表操作时,有时需要旋转链表的一部分,即将链表的最后几个节点移到链表的头部。本文将讲解 Python 实现旋转链表的方法。

方法

我们需要了解两个概念:旋转链表、链表反转。

旋转链表

假设链表为1-2-3-4-5,k=2,将链表后两个节点移动到链表头部,即转化为4-5-1-2-3。

做法如下:

  1. 先遍历链表,得出链表长度 n。
  2. 计算旋转的位置,即计算出在第几个节点处将链表切开(分成两个链表),并将原链表的最后一个节点指向原链表头结点。
  3. 再次遍历链表,将切开的两个链表分别反转。
  4. 将反转后的前链表的尾结点指向反转后的后链表的头结点,即可得到最终链表。

链表反转

假设链表为1-2-3-4-5,反转后变为5-4-3-2-1。

做法如下:

  1. 依次遍历链表,记录上一个节点和当前节点。
  2. 将当前节点的 next 指向上一个节点。
  3. 将上一个节点更新为当前节点,将当前节点往后移,继续遍历,直到结束。

代码示例

旋转链表

class Solution:
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head or not head.next or k == 0:
            return head

        # 计算链表长度
        length = 1
        p = head
        while p.next:
            p = p.next
            length += 1

        # 计算旋转位置
        k %= length
        if k == 0:
            return head
        p.next = head # 首尾相连
        cut = length - k
        p = head
        for i in range(cut-1):
            p = p.next
        new_head = p.next
        p.next = None

        # 反转链表
        old_head = head
        new_head = self.reverseList(new_head)
        head = self.reverseList(old_head)
        old_head.next = new_head

        return head

    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        pre = None
        cur = head
        while cur:
            next_node = cur.next
            cur.next = pre
            pre = cur
            cur = next_node
        return pre

示例

示例1:

链表:1-2-3-4-5, k=2

旋转后链表:4-5-1-2-3

s = Solution()
head = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)
head.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
k = 2
new_head = s.rotateRight(head, k)
while new_head:
    print(new_head.val)
    new_head = new_head.next

输出:

4
5
1
2
3

示例2:

链表:0-1-2, k=4

旋转后链表:2-0-1

s = Solution()
head = ListNode(0)
node1 = ListNode(1)
node2 = ListNode(2)
head.next = node1
node1.next = node2
k = 4
new_head = s.rotateRight(head, k)
while new_head:
    print(new_head.val)
    new_head = new_head.next

输出:

2
0
1

总结

本文详细介绍了 Python 实现旋转链表的方法,涉及到链表长度计算、链表反转、链表节点合并等知识点。同时给出了两个示例,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 数据结构之旋转链表 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言类的双向链表详解

    C语言类的双向链表详解 基本概念 什么是双向链表? 双向链表是链表的一种,它有两个指针域:一个指向前一个结点,一个指向后一个结点。每个结点包含两个部分:数据和指针域,指针域分别指向前一个结点和后一个结点,所以每个结点都是由数据和两个指针域构成的。 双向链表的作用? 双向链表可以支持O(1)时间复杂度的在任何一个结点前或后插入一个结点。 双向链表的实现方式? …

    数据结构 2023年5月17日
    00
  • C++如何实现BitMap数据结构

    下面我将详细讲解C++如何实现BitMap数据结构的完整攻略,包含以下几个方面: 什么是BitMap数据结构 如何使用C++实现BitMap数据结构 BitMap数据结构的应用示例说明 1. 什么是BitMap数据结构 BitMap数据结构也叫位图,是一种非常简单而高效的数据结构,它主要是用来对大量数字进行存储和操作的。所谓BitMap,就是将一个数字序列通…

    数据结构 2023年5月17日
    00
  • C++数据结构之堆详解

    C++数据结构之堆详解 什么是堆 堆是一种完全二叉树。 堆分为大根堆和小根堆,大根堆满足每个节点的值都大于等于它的子节点,小根堆满足每个节点的值都小于等于它的子节点。 堆的实现 常见的实现堆的方式有数组和链表两种。 数组 由于二叉堆是完全二叉树,所以可以用数组来实现: 对于一个节点i,它的左子节点的下标是2 * i + 1,右子节点的下标是2 * i + 2…

    数据结构 2023年5月17日
    00
  • AtCoder Beginner Contest 300

    A – N-choice question (abc300 a) 题目大意 给定一个元素互不相同的数组\(c\)和 \(a,b\),找到 \(i\)使得 \(c_i = a + b\) 解题思路 直接for循环寻找即可。 神奇的代码 #include <bits/stdc++.h> using namespace std; using LL = …

    算法与数据结构 2023年4月30日
    00
  • Redis数据结构之链表与字典的使用

    Redis是一个开源、基于内存的数据结构存储系统。Redis支持多种数据类型,包括字符串、整数、浮点数、列表、哈希表、集合、有序集合等。本文将详细介绍Redis数据结构之链表与字典的使用。 链表 链表是Redis中常用的数据结构之一,主要用于存储有序的元素列表。链表中的每个元素都包含了一个指向前驱元素和后继元素的指针,这种结构可以方便地实现链表的插入、删除和…

    数据结构 2023年5月17日
    00
  • C++数据结构链表基本操作示例过程

    C++数据结构链表基本操作示例过程 链表是一种重要的数据结构,C++中链表的操作是非常常见的,下面我将详细介绍C++中链表的基本操作,包括创建链表、插入节点、删除节点和遍历链表等。 创建链表 首先,需要创建一个链表结构体,并定义节点类型struct Node,其中包含元素数据及下一个节点的指针。 struct Node { int data; Node* n…

    数据结构 2023年5月17日
    00
  • Python数据结构与算法的双端队列详解

    Python数据结构与算法的双端队列详解 双端队列(deque)是一种具有队列和栈的性质的数据结构。与队列和栈不同的是双端队列允许从两端添加和删除元素。Python语言中内置了deque模块,使得在实现双端队列时更加方便快捷。 1.双端队列基本操作 from collections import deque # 创建双端队列 d = deque() # 在队…

    数据结构 2023年5月17日
    00
  • Java二叉树查询原理深入分析讲解

    Java二叉树查询原理深入分析讲解 什么是二叉树? 二叉树是一种数据结构,它由节点和边组成,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的节点是按照一定顺序排列的,这个顺序被称为遍历顺序。通常,我们使用前序遍历、中序遍历和后序遍历三种方法来遍历二叉树。 二叉树的查询 二叉树的查询是指在二叉树中查找包含特定数据的节点。通常,我们使用递归算法…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部