题目来自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;
}
};
下面是递归过程的图解: