国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++數據結構與算法之反轉鏈表的方法詳解

2020-01-26 13:57:00
字體:
來源:轉載
供稿:網友

本文實例講述了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 << temp->data << std::endl;  temp = temp->next; }}

完整代碼如下:

#include <iostream>/* 節點結構 */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;  }}int main() {  struct NODE* n = NULL;  add(&n, 1);  add(&n, 2);  add(&n, 3);  n = reverse(n);  print(n);  return 0;}

希望本文所述對大家C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 上栗县| 犍为县| 岳阳市| 昌江| 甘谷县| 富锦市| 儋州市| 芦山县| 阜康市| 尼勒克县| 阿合奇县| 上思县| 黎川县| 额尔古纳市| 长泰县| 翼城县| 屏东县| 桦甸市| 德格县| 镇巴县| 清河县| 武威市| 灵山县| 金乡县| 琼中| 苍溪县| 吴旗县| 米易县| 特克斯县| 嘉祥县| 无为县| 西畴县| 崇州市| 紫阳县| 额敏县| 盐城市| 海口市| 永州市| 南华县| 清丰县| 名山县|