單鏈表反轉的遞迴與非遞迴解法
阿新 • • 發佈:2019-01-04
題目來自Leetcode
206. Reverse Linked List
Reverse a singly linked list.
Hint:
A linked list can be reversed eitheriteratively or recursively. Could you implement both?
classSolution { public: ListNode* reverseList(ListNode* head) { //iterative version using 3 pointers ListNode* p,*q,*r; //empty list if(!head) return NULL; p=head; q=p->next; //only one node if(q==NULL) return p; else{ if(q->next!=NULL) r=q->next; else r=NULL; } p->next=NULL; q->next=p; while(r){ p=q; q=r; r=q->next; q->next=p; } return q; } };
下面是用遞迴的解法:
classSolution { public: ListNode* reverseList(ListNode* head) { if(head==NULL || head->next==NULL) returnhead; ListNode*smallo=reverseList(head->next); ListNode*tail=head->next; tail->next=head; head->next=NULL; return smallo; } };
類似地。。。
classSolution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !(head -> next)) returnhead;
ListNode* node = reverseList(head ->next);
head -> next -> next = head;
head -> next = NULL;
return node;
}
};
下面是遞迴過程的圖解: