使用C++反转一个双向链表

使用c++反转一个双向链表

在本文中,我们有一个双向链表,我们将解释在 C++ 中反转双向链表的不同方法。例如 –

Input : {1, 2, 3, 4}Output : {4, 3, 2, 1}

登录后复制

通常会想到一种方法,但我们将使用两种方法 – 正常方法和非正统方法。

正常方法

在这种方法中,我们将经历列表,当我们浏览它时,我们将其反转。

示例

#include using namespace std;class Node {   public:   int data;   Node *next;   Node *prev;};void reverse(Node **head_ref) {   auto temp = (*head_ref) -> next;   (*head_ref) -> next = (*head_ref) -> prev;   (*head_ref) -> prev = temp;   if(temp != NULL) {      (*head_ref) = (*head_ref) -> prev;      reverse(head_ref);   }   else      return;}void push(Node** head_ref, int new_data) {   Node* new_node = new Node();   new_node->data = new_data;   new_node->prev = NULL;   new_node->next = (*head_ref);   if((*head_ref) != NULL)      (*head_ref) -> prev = new_node ;   (*head_ref) = new_node;}int main() {   Node* head = NULL;   push(&head, 6);   push(&head, 4);   push(&head, 8);   push(&head, 9);   auto node = head;   cout data next;   }   cout data next;   }   return 0;}

登录后复制

输出

Before9 8 4 6After6 4 8 9

登录后复制登录后复制

这种方法需要O(N)时间复杂度,这是非常好的,因为这种复杂度可以在更高的约束下执行。

立即学习“C++免费学习笔记(深入)”;

非正统方法

作为顾名思义,这不是用户想到的一种非常常见的方法,但我们也会探索这种方法。在这种方法中,我们将创建一个堆栈并不断向其中推送数据,在弹出时我们将更改它的值。

示例

#include using namespace std;class Node {   public:   int data;   Node *next;   Node *prev;};void push(Node** head_ref, int new_data) {   Node* new_node = new Node();   new_node->data = new_data;   new_node->prev = NULL;   new_node->next = (*head_ref);   if((*head_ref) != NULL)      (*head_ref) -> prev = new_node ;   (*head_ref) = new_node;}int main() {   Node* head = NULL;   push(&head, 6);   push(&head, 4);   push(&head, 8);   push(&head, 9);   auto node = head;   cout >> "Before" ;   while(node != NULL) {      cout >> node->data >> " ";      node = node->next;   }   cout >> "";   stack s;   node = head;   while(node) {      head = node;      s.push(node);      node = node -> next;   }   while(!s.empty()) {      auto x = s.top();      auto temp = x -> prev;      x -> prev = x -> next;      x -> next = temp;      s.pop();   }   node = head;   cout data next;   }   return 0;}

登录后复制

输出

Before9 8 4 6After6 4 8 9

登录后复制登录后复制

上述代码的解释

在这种方法中,我们使用一个堆栈,在遍历列表时填充该堆栈,然后将项目从堆栈中弹出并更改它们的值,以便列表是相反的。 O(N) 是该程序的时间复杂度,它也适用于更高的约束。

结论

在本文中,我们解决了一个使用 or 反转双向链表的问题没有堆栈。时间复杂度为 O(N),其中 N 是列表的大小。我们还学习了解决此问题的 C++ 程序以及解决此问题的完整方法(正常和非正统)。我们可以用其他语言比如C、java、python等语言来编写同样的程序。我们希望这篇文章对您有所帮助。

以上就是使用C++反转一个双向链表的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2584763.html

(0)
上一篇 2025年3月6日 14:53:04
下一篇 2025年3月6日 14:53:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • C令牌是什么?

    这个C程序是一系列指令,每个指令都是一系列个体单元的集合。 C程序中的每个小个体单元通常被称为令牌,C程序中的每个指令都是令牌的集合。 令牌用于构建C程序,它们也被称为C程序的基本构建块。 在C程序中,令牌包含以下内容: 关键字标识符运算符…

    2025年3月6日
    200
  • 在C语言中,隐式返回类型为int

    如果某个函数没有返回类型,则返回类型将默认为int。如果没有指定返回类型,则不会产生任何错误。然而,即使返回类型是int,C99版本也不允许省略返回类型。 示例 #includemy_function(int x) {   return x…

    2025年3月6日
    200
  • 在C语言中,while(1)和while(0)之间的区别是什么?

    我们知道在C语言中,’while’关键字用于定义一个循环,该循环根据传递给循环的条件来工作。现在,由于条件可以有两个值,即真或假,所以如果条件为真,则while块内的代码将被重复执行,如果条件为假,则代码将不会被执行…

    2025年3月6日
    200
  • C语言中的多行宏

    In this section we will see, how can write multiline macros in C. We can write multiline macros like functions, but for …

    2025年3月6日
    200
  • 在C++中的可重构数

    给定一个整数类型的值,假设为number。任务是检查给定的数字是否可重构。如果是,打印该数字是可重构数字,否则打印不可能。 什么是可重构数字? 当一个数字可以被其可用因子的总数整除时,它就是可重构的。例如,数字9是可重构的,因为它有3个因子…

    2025年3月6日
    200
  • 计算菱形的面积和周长的程序,已知对角线是什么?在C++中,什么是菱形?

    什么是菱形? 在几何学中,菱形是四个边长相同的四边形。菱形与形状菱形相似。如果菱形的对角线成直角,那么它就变成正方形。 菱形的性质是 – 边相等对边平行,对角相等,是平行四边形对角线平分直角 下图是菱形 立即学习“C++免费学习…

    2025年3月6日
    200
  • 使用C++编写,找到子数组中的质数数量

    在本文中,我们将描述查找子数组中素数数量的方法。我们有一个正数数组 arr[] 和 q 个查询,其中有两个整数表示我们的范围 {l, R},我们需要找到给定范围内的素数数量。下面是给定问题的示例 – Input : arr[] …

    2025年3月6日
    200
  • C/C++程序中的数组

    数组是一组固定数量的相同数据类型的项目。这些元素存储在内存中的连续内存位置中。 可以使用方括号“[]”和数组名称像a[4]、a[3]等从其索引值访问值的每个单个元素。 声明数组 在c/c++编程语言中,通过定义数组的类型和长度(元素数量)来…

    2025年3月6日
    200
  • 解释C语言中选择排序的过程

    选择排序是一种攻击性算法,用于从数组中找到最小的数字,然后将其放置到第一个位置。下一个要遍历的数组将从索引开始,靠近放置最小数字的位置。 选择排序的过程 选择元素列表中第一个最小的元素并将其放置在第一个位置。 对列表中的其余元素重复相同的操…

    2025年3月6日 编程技术
    200
  • 当在C/C++中的数字常量前加上0时,这意味着它是一个八进制数

    有时我们可能会看到一些数字文字,其前缀为0。这表明该数字是八进制数。所以八进制文字在开头包含 0。例如,如果八进制数是 25,那么我们必须写 025。 示例 #include int main() {   int a = 025;   in…

    2025年3月6日
    200

发表回复

登录后才能评论