数据结构与算法(c++)——反转链表
2017-04-16 16:37
288 查看
算法概述:要求实现将一条单向链表反转并考虑时间复杂度。
算法分析:
数组法(略):
将列表元素逐个保存进数组,之后再逆向重建列表
点评:实现逻辑最简单,需要额外的内存开销。
移动指针:
通过三个指针逐个从链表头开始逐一反转链表元素的指针
点评:不需要额外的内存开销,会改变原始链表。
递归:
以递归的方式首先找到链表尾部,再逐一反转指针
点评:不需要额外的内存开销,不会改变原始链表。
算法实现:
构建链表结构
移动指针
递归
打印链表
>>完整代码
算法分析:
数组法(略):
将列表元素逐个保存进数组,之后再逆向重建列表
点评:实现逻辑最简单,需要额外的内存开销。
移动指针:
通过三个指针逐个从链表头开始逐一反转链表元素的指针
点评:不需要额外的内存开销,会改变原始链表。
递归:
以递归的方式首先找到链表尾部,再逐一反转指针
点评:不需要额外的内存开销,不会改变原始链表。
算法实现:
构建链表结构
/* 节点结构 */ 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 << temp->data << std::endl; temp = temp->next; } }
>>完整代码
相关文章推荐
- C++数据结构与算法之反转链表的方法详解
- C/C++面试程序题(一)——字符串反转、链表反转的递归、非递归实现
- 数据结构 - 反转单链表(C++)
- C++链表K个节点K个节点的反转((1,2,3,4),如果k是2,反转结果是(2,1,4,3))
- 剑指offer第十五题【反转链表】c++实现
- 【C++】反转链表
- C++中经典的单向链表反转
- 数据结构与算法之反转链表
- C++将链表反转的实现
- 数据结构与算法学习 第1季02 链表的基本功能 C++实现
- 链表反转 C++
- C++ 数据结构与算法(三)线性表之双向链表
- C 链表的反转(数据结构与算法)
- 反转链表与指针传递 c++
- C++ 单链表反转
- 新手学习数据结构与算法---单链表(C++版, 跟C还是有点差别的)
- 单链表的反转 c++
- 反转链表 C++实现
- 剑指offer刷题之c++实现的反转链表
- C++单向链表反转