热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C++数据结构与算法之反转链表的方法详解

这篇文章主要介绍了C++数据结构与算法之反转链表的方法,结合实例形式分析了C++反转链表的原理、实现方法及相关注意事项,需要的朋友可以参考下

本文实例讲述了C++数据结构与算法之反转链表的方法。分享给大家供大家参考,具体如下:

算法概述:要求实现将一条单向链表反转并考虑时间复杂度。

算法分析:

数组法(略):

将列表元素逐个保存进数组,之后再逆向重建列表
点评:实现逻辑最简单,需要额外的内存开销。

移动指针:

通过三个指针逐个从链表头开始逐一反转链表元素的指针
点评:不需要额外的内存开销,会改变原始链表。

递归:

以递归的方式首先找到链表尾部,再逐一反转指针
点评:不需要额外的内存开销,不会改变原始链表。

算法实现:

构建链表结构

/* 节点结构 */
struct NODE
{
 int data;
 struct NODE* next;
};
/* 添加元素-压栈 */
void push(NODE** head, int dat) {
 struct NODE* new_node = new NODE();
 new_node->data = dat;
 new_node->next = *head;
 *head = new_node;
}
/* 添加元素-添加 */
void add(NODE** head, int dat) {
 struct NODE* new_node = new NODE();
 new_node->data = dat;
 new_node->next = NULL;
 if (*head != NULL) {
  struct NODE* temp = *head;
  while (temp->next != NULL) {
   temp = temp->next;
  } 
  temp->next = new_node;
 }
 else {
  *head = new_node;
 }
}

移动指针

/* 反转列表 */
void reverse(NODE** head) {
 struct NODE* pre = NULL;
 struct NODE* cur = *head;
 struct NODE* nxt;
 while (cur != NULL) {
  // 反转指针
  nxt = cur->next;
  cur->next = pre;
  // 移动指针
  pre = cur;
  cur = nxt;
 }
 *head = pre;
}

递归

/* 反转列表-复制原表返回反转表 */
NODE* reverse(NODE* head) {
 if (head == NULL || head->next == NULL) {
  return head;
 }
 NODE* new_head = reverse(head->next);
 // 反转指针
 head->next->next = head;
 head->next = NULL;
 return new_head;
}

打印链表

/* 打印队列 */
void print(NODE* head) {
 NODE* temp = head;
 while (temp != NULL) {
  std::cout <data <next;
 }
}

完整代码如下:

#include 
/* 节点结构 */
struct NODE
{
  int data;
  struct NODE* next;
};
/* 添加元素-压栈 */
void push(NODE** head, int dat) {
  struct NODE* new_node = new NODE();
  new_node->data = dat;
  new_node->next = *head;
  *head = new_node;
}
/* 添加元素-添加 */
void add(NODE** head, int dat) {
  struct NODE* new_node = new NODE();
  new_node->data = dat;
  new_node->next = NULL;
  if (*head != NULL) {
    struct NODE* temp = *head;
    while (temp->next != NULL) {
      temp = temp->next;
    }  
    temp->next = new_node;
  }
  else {
    *head = new_node;
  }
}
/* 反转列表 */
void reverse(NODE** head) {
  struct NODE* pre = NULL;
  struct NODE* cur = *head;
  struct NODE* nxt;
  while (cur != NULL) {
    // 反转指针
    nxt = cur->next;
    cur->next = pre;
    // 移动指针
    pre = cur;
    cur = nxt;
  }
  *head = pre;
}
/* 反转列表-复制原表返回反转表 */
NODE* reverse(NODE* head) {
  if (head == NULL || head->next == NULL) {
    return head;
  }
  NODE* new_head = reverse(head->next);
  // 反转指针
  head->next->next = head;
  head->next = NULL;
  return new_head;
}
/* 打印队列 */
void print(NODE* head) {
  NODE* temp = head;
  while (temp != NULL) {
    std::cout <data <next;
  }
}
int main() {
  struct NODE* n = NULL;
  add(&n, 1);
  add(&n, 2);
  add(&n, 3);
  n = reverse(n);
  print(n);
  return 0;
}

希望本文所述对大家C++程序设计有所帮助。


推荐阅读
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
author-avatar
周天芷65486
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有