最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解

 更新時間:2017年08月25日 14:40:34   作者:冷豪  
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法,結(jié)合實例形式分析了C++反轉(zhuǎn)鏈表的原理、實現(xiàn)方法及相關(guān)注意事項,需要的朋友可以參考下

本文實例講述了C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法。分享給大家供大家參考,具體如下:

算法概述:要求實現(xiàn)將一條單向鏈表反轉(zhuǎn)并考慮時間復(fù)雜度。

算法分析:

數(shù)組法(略):

將列表元素逐個保存進(jìn)數(shù)組,之后再逆向重建列表
點評:實現(xiàn)邏輯最簡單,需要額外的內(nèi)存開銷。

移動指針:

通過三個指針逐個從鏈表頭開始逐一反轉(zhuǎn)鏈表元素的指針
點評:不需要額外的內(nèi)存開銷,會改變原始鏈表。

遞歸:

以遞歸的方式首先找到鏈表尾部,再逐一反轉(zhuǎn)指針
點評:不需要額外的內(nèi)存開銷,不會改變原始鏈表。

算法實現(xiàn):

構(gòu)建鏈表結(jié)構(gòu)

/* 節(jié)點結(jié)構(gòu) */
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;
 }
}

移動指針

/* 反轉(zhuǎn)列表 */
void reverse(NODE** head) {
 struct NODE* pre = NULL;
 struct NODE* cur = *head;
 struct NODE* nxt;
 while (cur != NULL) {
  // 反轉(zhuǎn)指針
  nxt = cur->next;
  cur->next = pre;
  // 移動指針
  pre = cur;
  cur = nxt;
 }
 *head = pre;
}

遞歸

/* 反轉(zhuǎn)列表-復(fù)制原表返回反轉(zhuǎn)表 */
NODE* reverse(NODE* head) {
 if (head == NULL || head->next == NULL) {
  return head;
 }
 NODE* new_head = reverse(head->next);
 // 反轉(zhuǎn)指針
 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>
/* 節(jié)點結(jié)構(gòu) */
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;
  }
}
/* 反轉(zhuǎn)列表 */
void reverse(NODE** head) {
  struct NODE* pre = NULL;
  struct NODE* cur = *head;
  struct NODE* nxt;
  while (cur != NULL) {
    // 反轉(zhuǎn)指針
    nxt = cur->next;
    cur->next = pre;
    // 移動指針
    pre = cur;
    cur = nxt;
  }
  *head = pre;
}
/* 反轉(zhuǎn)列表-復(fù)制原表返回反轉(zhuǎn)表 */
NODE* reverse(NODE* head) {
  if (head == NULL || head->next == NULL) {
    return head;
  }
  NODE* new_head = reverse(head->next);
  // 反轉(zhuǎn)指針
  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++程序設(shè)計有所幫助。

相關(guān)文章

  • C語言中for循環(huán)問題(一個小坑需注意)

    C語言中for循環(huán)問題(一個小坑需注意)

    這篇文章主要給大家介紹了關(guān)于C語言中for循環(huán)問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • static關(guān)鍵字的作用詳解

    static關(guān)鍵字的作用詳解

    在C語言中,static的字面意思很容易把我們導(dǎo)入歧途,其實它的作用有三條。
    2013-04-04
  • C語言中條件判斷的正確使用姿勢

    C語言中條件判斷的正確使用姿勢

    在C語言中,有三種條件判斷結(jié)構(gòu):if語句、if-else語句和switch語句,這篇文章主要來和大家講解一下它們的正確使用姿勢,需要的可以參考一下
    2023-05-05
  • VC小技巧匯總之窗口技巧

    VC小技巧匯總之窗口技巧

    這篇文章主要介紹了VC小技巧匯總之窗口技巧,功能非常實用,對于VC開發(fā)有一定借鑒價值,需要的朋友可以參考下
    2014-07-07
  • 基于Qt編寫簡易的視頻播放器

    基于Qt編寫簡易的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt實現(xiàn)編寫簡易的視頻播放器,可以支持pbonon/qmediaplayer/ffmpeg/vlc/mpv等多種內(nèi)核,感興趣的可以學(xué)習(xí)一下
    2022-12-12
  • 詳解C語言-二級指針三種內(nèi)存模型

    詳解C語言-二級指針三種內(nèi)存模型

    這篇文章主要介紹了詳解C語言-二級指針三種內(nèi)存模型的相關(guān)知識,文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C語言進(jìn)階輸入輸出重定向與fopen函數(shù)使用示例詳解

    C語言進(jìn)階輸入輸出重定向與fopen函數(shù)使用示例詳解

    這篇文章主要為大家介紹了C語言進(jìn)階輸入輸出重定向與fopen函數(shù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C數(shù)據(jù)結(jié)構(gòu)循環(huán)鏈表實現(xiàn)約瑟夫環(huán)

    C數(shù)據(jù)結(jié)構(gòu)循環(huán)鏈表實現(xiàn)約瑟夫環(huán)

    這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)循環(huán)鏈表實現(xiàn)約瑟夫環(huán)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言for循環(huán)嵌套for循環(huán)在實踐題目中應(yīng)用詳解

    C語言for循環(huán)嵌套for循環(huán)在實踐題目中應(yīng)用詳解

    初學(xué)C語言,常常遇到for循環(huán)中嵌套個for循環(huán),初學(xué)者對于這種形式總是一知半解,這次我就整理了常見的for循環(huán)嵌套for循環(huán)的題目,我們一起爭取一舉拿下這類題。學(xué)廢他們,以后再見到就不怕啦!每天都要學(xué)一點呀。加油,奮斗的我們
    2022-05-05
  • C++11新增的包裝器詳解

    C++11新增的包裝器詳解

    由于函數(shù)調(diào)用可以使用函數(shù)名、函數(shù)指針、函數(shù)對象或有名稱的lambda表達(dá)式,可調(diào)用類型太豐富導(dǎo)致模板的效率極低。包裝器用于解決效率低的問題
    2022-08-08

最新評論

聂荣县| 敦煌市| 白城市| 克山县| 莆田市| 福泉市| 都江堰市| 贵溪市| 蒲江县| 双鸭山市| 阳西县| 青铜峡市| 平罗县| 抚远县| 栾城县| 黔东| 城市| 贵德县| 得荣县| 长泰县| 华池县| 临湘市| 财经| 都匀市| 香河县| 甘洛县| 博客| 那坡县| 巴彦淖尔市| 和龙市| 大竹县| 尉犁县| 如东县| 桐庐县| 潜山县| 奉节县| 安达市| 大安市| 新晃| 奎屯市| 鲁山县|