数据结构单链表之旋转链表 | 第十五套

简介: 数据结构单链表之旋转链表 | 第十五套

给定一个单链表,将链表逆时针旋转 k 个节点。其中 k 是给定的正整数。例如,如果给定的链表是 10->20->30->40->50->60 且 k 为 4,则该链表应修改为 50->60->10->20->30- > 40。假设 k 小于链表中的节点数。

方法一:

要旋转链表,我们需要将第k个节点的next改为NULL,将最后一个节点的next改为上一个头节点,最后将head改为第(k+1)个节点。所以我们需要掌握三个节点:第k个节点、第(k+1)个节点和最后一个节点。

从头开始遍历列表并在第 k 个节点处停止。存储指向第 k 个节点的指针。我们可以使用 kthNode->next 得到第 (k+1) 个节点。继续遍历直到最后并存储指向最后一个节点的指针。最后,如上所述更改指针。


#include <bits/stdc++.h>
using namespace std;
class Node {
public:
  int data;
  Node* next;
};
void rotate(Node** head_ref, int k)
{
  if (k == 0)
    return;
  Node* current = *head_ref;
  int count = 1;
  while (count < k && current != NULL) {
    current = current->next;
    count++;
  }
  if (current == NULL)
    return;
  Node* kthNode = current;
  while (current->next != NULL)
    current = current->next;
  current->next = *head_ref;
  *head_ref = kthNode->next;
  kthNode->next = NULL;
}
void push(Node** head_ref, int new_data)
{
  Node* new_node = new Node();
  new_node->data = new_data;
  new_node->next = (*head_ref);
  (*head_ref) = new_node;
}
void printList(Node* node)
{
  while (node != NULL) {
    cout << node->data << " ";
    node = node->next;
  }
}
int main(void)
{
  Node* head = NULL;
  for (int i = 60; i > 0; i -= 10)
    push(&head, i);
  cout << "Given linked list \n";
  printList(head);
  rotate(&head, 4);
  cout << "\nRotated Linked list \n";
  printList(head);
  return (0);
}

输出:

Given linked list
10  20  30  40  50  60
Rotated Linked list
50  60  10  20  30  40

时间复杂度:O(n),其中 n 是链表中的节点数。代码只遍历链表一次。

如果您发现任何不正确的内容,或者您想分享有关上述主题的更多信息,请发表评论。

方法2:

将链表旋转k,我们可以先使链表循环,然后从头节点向前移动k-1步,使第(k-1)个节点紧挨着空,并以第k个节点为头。

#include <bits/stdc++.h>
using namespace std;
class Node {
public:
  int data;
  Node* next;
};
void rotate(Node** head_ref, int k)
{
  if (k == 0)
    return;
  Node* current = *head_ref;
  while (current->next != NULL)
    current = current->next;
  current->next = *head_ref;
  current = *head_ref;
  for (int i = 0; i < k - 1; i++)
    current = current->next;
  *head_ref = current->next;
  current->next = NULL;
}
void push(Node** head_ref, int new_data)
{
  Node* new_node = new Node();
  new_node->data = new_data;
  new_node->next = (*head_ref);
  (*head_ref) = new_node;
}
void printList(Node* node)
{
  while (node != NULL) {
    cout << node->data << " ";
    node = node->next;
  }
}
int main(void)
{
  Node* head = NULL;
  for (int i = 60; i > 0; i -= 10)
    push(&head, i);
  cout << "Given linked list \n";
  printList(head);
  rotate(&head, 4);
  cout << "\nRotated Linked list \n";
  printList(head);
  return (0);
}

输出:

Given linked list 
10 20 30 40 50 60 
Rotated Linked list 
50 60 10 20 30 40


目录
相关文章
|
3月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
80 4
|
14天前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
76 29
|
14天前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
71 25
|
1月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
38 5
|
2月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
71 0
|
8月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
8月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
8月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
76 2

热门文章

最新文章