鏈表逆序的遞歸實(shí)現(xiàn)

鏈表逆序是個(gè)很基礎(chǔ)的算法,考察的是指針操作和基本數(shù)據(jù)結(jié)構(gòu)携取。常規(guī)的寫(xiě)法當(dāng)然是OK的纳令,不過(guò)要是還會(huì)寫(xiě)出一個(gè)遞歸的鏈表逆序算法,那別人肯定要給你點(diǎn)個(gè)贊了进栽。

1 問(wèn)題描述

給定一個(gè)鏈表德挣,請(qǐng)將其逆序。即如果鏈表原來(lái)為1->2->3->4->5->null快毛,逆序后為5->4->3->2->1->null.

2 常規(guī)寫(xiě)法(迭代)

迭代算法效率較高格嗅,但是代碼比遞歸算法略長(zhǎng)。遞歸算法雖然代碼量更少唠帝,但是難度也稍大屯掖,不細(xì)心容易寫(xiě)錯(cuò)。迭代算法的思想就是遍歷鏈表襟衰,改變鏈表節(jié)點(diǎn)next指向贴铜,遍歷完成,鏈表逆序也就完成了瀑晒。代碼如下:

struct node {
    int data;
    struct node* next;
};
typedef struct node* pNode;

pNode reverse(pNode head)
{
    pNode current = head;
    pNode next = NULL, result = NULL;
    while (current != NULL) {
        next = current->next;
        current->next = result;
        result = current;
        current = next;
    }
    return result;
}

如果不返回值绍坝,可以傳遞參數(shù)改為指針的指針,直接修改鏈表的頭結(jié)點(diǎn)值(如果在C++中直接傳遞引用更方便)苔悦,可以寫(xiě)出下面的代碼:

void reverse(pNode* headRef)
{   
    pNode current = *headRef;
    pNode next = NULL, result = NULL;
    while (current != NULL) {
        next = current->next;
        current->next = result;
        result = current;
        current = next;
    }
    *headRef = result;
}

3 進(jìn)階寫(xiě)法(遞歸)

遞歸寫(xiě)法的實(shí)現(xiàn)原理:假定原鏈表為1轩褐,2,3间坐,4灾挨,則先逆序后面的2邑退,3,4變?yōu)?劳澄,3地技,2,然后將節(jié)點(diǎn)1鏈接到已經(jīng)逆序的4秒拔,3莫矗,2后面,形成4砂缩,3作谚,2,1庵芭,完成整個(gè)鏈表的逆序妹懒。代碼如下:

void reverseRecur(pNode* headRef)
{
    if (*headRef == NULL)  return;
    pNode first, rest;
    first = *headRef;      
    rest = first->next;   
    if (rest == NULL) return;
    reverseRecur(&rest); 
    first->next->next = first; //注意這里不要錯(cuò)寫(xiě)成rest->next = first噢,請(qǐng)想想指針的指向双吆。
    first->next = NULL;
    *headRef = rest;  //更新頭結(jié)點(diǎn)
}

如果使用C++的引用類(lèi)型眨唬,代碼會(huì)稍顯簡(jiǎn)單點(diǎn),代碼如下:

void reverseRecur(pNode& p)
{
    if (!p) return;
    pNode rest = p->next;
    if (!rest) return;
    reverseRecur(rest);
    p->next->next = p;
    p->next = NULL;
    p = rest;
}

參考資料

leetcode的鏈表某一節(jié)的題目好乐,具體鏈接找不到了匾竿,請(qǐng)見(jiàn)諒

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蔚万,隨后出現(xiàn)的幾起案子岭妖,更是在濱河造成了極大的恐慌,老刑警劉巖反璃,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昵慌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淮蜈,警方通過(guò)查閱死者的電腦和手機(jī)废离,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)礁芦,“玉大人,你說(shuō)我怎么就攤上這事悼尾∈量郏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵闺魏,是天一觀的道長(zhǎng)未状。 經(jīng)常有香客問(wèn)我,道長(zhǎng)析桥,這世上最難降的妖魔是什么司草? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任艰垂,我火速辦了婚禮,結(jié)果婚禮上埋虹,老公的妹妹穿的比我還像新娘猜憎。我一直安慰自己,他們只是感情好搔课,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布胰柑。 她就那樣靜靜地躺著,像睡著了一般爬泥。 火紅的嫁衣襯著肌膚如雪柬讨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,919評(píng)論 1 290
  • 那天袍啡,我揣著相機(jī)與錄音踩官,去河邊找鬼。 笑死境输,一個(gè)胖子當(dāng)著我的面吹牛蔗牡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畴嘶,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蛋逾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窗悯?” 一聲冷哼從身側(cè)響起区匣,我...
    開(kāi)封第一講書(shū)人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒋院,沒(méi)想到半個(gè)月后亏钩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欺旧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年姑丑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辞友。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栅哀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出称龙,到底是詐尸還是另有隱情留拾,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布鲫尊,位于F島的核電站痴柔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疫向。R本人自食惡果不足惜咳蔚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一豪嚎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谈火,春花似錦侈询、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谍肤,卻和暖如春啦租,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荒揣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工篷角, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人系任。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓恳蹲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親俩滥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘉蕾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容