您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)C++如何實(shí)現(xiàn)LeetCode的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
之前做到 Reverse Linked List II 的時(shí)候我還納悶怎么只有二沒有一呢,原來真是忘了啊,現(xiàn)在才加上,這道題跟之前那道比起來簡單不少,題目為了增加些許難度,讓我們分別用迭代和遞歸來實(shí)現(xiàn),但難度還是不大。我們先來看迭代的解法,思路是在原鏈表之前建立一個(gè)空的newHead,因?yàn)槭坠?jié)點(diǎn)會(huì)變,然后從head開始,將之后的一個(gè)節(jié)點(diǎn)移到newHead之后,重復(fù)此操作直到head成為末節(jié)點(diǎn)為止,代碼如下:
解法一:
class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *newHead = NULL; while (head) { ListNode *t = head->next; head->next = newHead; newHead = head; head = t; } return newHead; } };
下面我們來看遞歸解法,代碼量更少,遞歸解法的思路是,不斷的進(jìn)入遞歸函數(shù),直到head指向倒數(shù)第二個(gè)節(jié)點(diǎn),因?yàn)閔ead指向空或者是最后一個(gè)結(jié)點(diǎn)都直接返回了,newHead則指向?qū)ead的下一個(gè)結(jié)點(diǎn)調(diào)用遞歸函數(shù)返回的頭結(jié)點(diǎn),此時(shí)newHead指向最后一個(gè)結(jié)點(diǎn),然后head的下一個(gè)結(jié)點(diǎn)的next指向head本身,這個(gè)相當(dāng)于把head結(jié)點(diǎn)移動(dòng)到末尾的操作,因?yàn)槭腔厮莸牟僮?,所以head的下一個(gè)結(jié)點(diǎn)總是在上一輪被移動(dòng)到末尾了,但head之后的next還沒有斷開,所以可以順勢(shì)將head移動(dòng)到末尾,再把next斷開,最后返回newHead即可,代碼如下:
解法二:
class Solution { public: ListNode* reverseList(ListNode* head) { if (!head || !head->next) return head; ListNode *newHead = reverseList(head->next); head->next->next = head; head->next = NULL; return newHead; } };
感謝各位的閱讀!關(guān)于“C++如何實(shí)現(xiàn)LeetCode”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。