您的位置:首页 > 其它

单链表的反转(递归与非递归方式)

2016-09-19 11:26 302 查看
定义链表结构

struct ListNode
{
int val;
ListNode *next;
ListNode(int v) : val(v), next(NULL) {}
};


非递归反转单链表

ListNode* reverse(ListNode *root)
{
if (root == NULL || root->next == NULL)
return root;
ListNode *cur = root->next;
root->next = NULL;
while (cur != NULL)
{
ListNode *tmp = cur->next;
cur->next = root;
root = cur;
cur = tmp;
}
return root;
}


递归反转单链表

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;
}


测试



#include <iostream>
using namespace std;
struct ListNode { int val; ListNode *next; ListNode(int v) : val(v), next(NULL) {} };
ListNode* createList(ListNode *root)
{
if (root == NULL)
{
ListNode *root = new ListNode(0);
ListNode *p1 = new ListNode(1);
ListNode *p2 = new ListNode(2);
root->next = p1;
p1->next = p2;
return root;
}
}
void tranverse(ListNode *root)
{
while (root != NULL)
{
cout << root->val << " ";
root = root->next;
}
cout << endl;
}
void deleteList(ListNode *root)
{
while (root != NULL)
{
delete root;
root = NULL;
}
}
ListNode* reverse(ListNode *root) { if (root == NULL || root->next == NULL) return root; ListNode *cur = root->next; root->next = NULL; while (cur != NULL) { ListNode *tmp = cur->next; cur->next = root; root = cur; cur = tmp; } return root; }
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; }

int main()
{
ListNode *root = createList(root);
//ListNode *root = NULL;
tranverse(root);
root = reverse(root);
tranverse(root);

ListNode *head = NULL;
reverseRec(root, head);
tranverse(head);

deleteList(head);
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: