C++實現(xiàn)LeetCode(206.倒置鏈表)
[LeetCode] 206.Reverse Linked List 倒置鏈表
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 的時候我還納悶怎么只有二沒有一呢,原來真是忘了啊,現(xiàn)在才加上,這道題跟之前那道比起來簡單不少,題目為了增加些許難度,讓我們分別用迭代和遞歸來實現(xiàn),但難度還是不大。我們先來看迭代的解法,思路是在原鏈表之前建立一個空的newHead,因為首節(jié)點會變,然后從head開始,將之后的一個節(jié)點移到newHead之后,重復(fù)此操作直到head成為末節(jié)點為止,代碼如下:
解法一:
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ù)第二個節(jié)點,因為head指向空或者是最后一個結(jié)點都直接返回了,newHead則指向?qū)ead的下一個結(jié)點調(diào)用遞歸函數(shù)返回的頭結(jié)點,此時newHead指向最后一個結(jié)點,然后head的下一個結(jié)點的next指向head本身,這個相當(dāng)于把head結(jié)點移動到末尾的操作,因為是回溯的操作,所以head的下一個結(jié)點總是在上一輪被移動到末尾了,但head之后的next還沒有斷開,所以可以順勢將head移動到末尾,再把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++實現(xiàn)LeetCode(206.倒置鏈表)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)倒置鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談c++如何實現(xiàn)并發(fā)中的Barrier
這篇文章主要介紹了淺談c++如何實現(xiàn)并發(fā)中的Barrier,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式代碼示例
數(shù)組元素和數(shù)組名都可以作為函數(shù)的參數(shù)以實現(xiàn)函數(shù)間數(shù)據(jù)的傳遞和共享,下面這篇文章主要給大家介紹了關(guān)于C++中數(shù)組作為函數(shù)參數(shù)傳入的幾種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06

