今晚抽时间复习了链表,整理了递归版本和非递归版本的单链表翻转,欢迎指出错误。
1、递归版本
调用:
ListNode * head = NULL;
reverseRec(root, head);//head即为反转后得链表头
实现如下:
void reverseRec(ListNode *root, ListNode *&head){
if (root == NULL)
return;
if (root->next == NULL){
head = root;
return;
}
reverseRec(root->next, head);
root->next->next = root;
root->next = NULL;
}
2、非递归版本
调用:
ListNode *head = reverse(root);//head即为翻转后的链表头
实现如下:
ListNode* reverse(ListNode *root)
{
if (root == NULL || root->next == NULL)
return root;
ListNode *cur = root;
ListNode *reverseHead = NULL;
ListNode *pre = NULL;
while (cur != NULL)
{
ListNode *tmp = cur->next;
if(tmp == NULL){
reverseHead = cur;
}
cur->next = pre;
pre = cur;
cur = tmp;
}
return reverseHead;
}