链表反转的两种实现方法
生活随笔
收集整理的這篇文章主要介紹了
链表反转的两种实现方法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
#include <iostream>
using namespace std;
//元結(jié)點(diǎn)
struct Node
{
? ? int data;
? ? Node *next;
};
//鏈表反轉(zhuǎn)(循環(huán)方法)
Node *Reverse(Node *head)
{
? ? Node *prev = NULL;
? ? Node *cur = NULL;
? ? Node *next = head;
? ? for (; next != NULL; )
? ? {
? ? ? ? cur = next;
? ? ? ? next = cur->next;
? ? ? ? cur->next = prev;
? ? ? ? prev = cur;
? ? }
? ? return prev;
}
//鏈表反轉(zhuǎn)(遞歸方法)
Node *Reverse2(Node *head)
{
? ? if (!head)
? ? {
? ? ? ? return NULL;
? ? }
? ? Node *temp = Reverse2(head->next);
? ? if (!temp)
? ? {
? ? ? ? return head;
? ? }
? ? head->next->next = head;
? ? head->next = NULL;
? ? return temp;
}
//創(chuàng)建鏈表
Node *Construct(int *const array, int len)
{
? ? Node *pre = NULL, *head = NULL;
? ? for (int i = len; i > 0; i--)
? ? {
? ? ? ? if (!pre)
? ? ? ? {
? ? ? ? ? ? head = new Node;
? ? ? ? ? ? head->data = array[len - i];
? ? ? ? ? ? head->next = NULL;
? ? ? ? ? ? pre = head;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? pre->next = new Node;
? ? ? ? ? ? pre = pre->next;
? ? ? ? ? ? pre->data = array[len - i];
? ? ? ? ? ? pre->next = NULL;
? ? ? ? }
? ? }
? ? return head;
}
//銷毀鏈表
void Destruct(Node *head)
{
? ? Node *cur = head, *temp = NULL;
? ? while (cur)
? ? {
? ? ? ? temp = cur;
? ? ? ? cur = cur->next;
? ? ? ? delete temp;
? ? }
}
//打印鏈表
void Print(Node *head)
{
? ? Node *cur = head;
? ? for (; cur != NULL; cur = cur->next)
? ? {
? ? ? ? cout << "data: " << cur->data << endl;
? ? }
}
int main(int argc, char* argv[])
{
? ? Node *head = NULL;
? ? int array[] = {1, 3, 5, 7, 9, 10, 8, 6, 4, 2};
? ? cout << endl << "Construct!" << endl << endl;
? ? head = Construct(array, 10);
? ? Print(head);
? ? cout << endl << "Reverse!" << endl << endl;
? ? head = Reverse(head);
? ? Print(head);
? ? cout << endl << "Reverse2!" << endl << endl;
? ? head = Reverse2(head);
? ? Print(head);
? ? cout << endl << "Destruct!" << endl << endl;
? ? Destruct(head);
? ? head = NULL;
? ? Print(head);
? ? return 0;
}
using namespace std;
//元結(jié)點(diǎn)
struct Node
{
? ? int data;
? ? Node *next;
};
//鏈表反轉(zhuǎn)(循環(huán)方法)
Node *Reverse(Node *head)
{
? ? Node *prev = NULL;
? ? Node *cur = NULL;
? ? Node *next = head;
? ? for (; next != NULL; )
? ? {
? ? ? ? cur = next;
? ? ? ? next = cur->next;
? ? ? ? cur->next = prev;
? ? ? ? prev = cur;
? ? }
? ? return prev;
}
//鏈表反轉(zhuǎn)(遞歸方法)
Node *Reverse2(Node *head)
{
? ? if (!head)
? ? {
? ? ? ? return NULL;
? ? }
? ? Node *temp = Reverse2(head->next);
? ? if (!temp)
? ? {
? ? ? ? return head;
? ? }
? ? head->next->next = head;
? ? head->next = NULL;
? ? return temp;
}
//創(chuàng)建鏈表
Node *Construct(int *const array, int len)
{
? ? Node *pre = NULL, *head = NULL;
? ? for (int i = len; i > 0; i--)
? ? {
? ? ? ? if (!pre)
? ? ? ? {
? ? ? ? ? ? head = new Node;
? ? ? ? ? ? head->data = array[len - i];
? ? ? ? ? ? head->next = NULL;
? ? ? ? ? ? pre = head;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? pre->next = new Node;
? ? ? ? ? ? pre = pre->next;
? ? ? ? ? ? pre->data = array[len - i];
? ? ? ? ? ? pre->next = NULL;
? ? ? ? }
? ? }
? ? return head;
}
//銷毀鏈表
void Destruct(Node *head)
{
? ? Node *cur = head, *temp = NULL;
? ? while (cur)
? ? {
? ? ? ? temp = cur;
? ? ? ? cur = cur->next;
? ? ? ? delete temp;
? ? }
}
//打印鏈表
void Print(Node *head)
{
? ? Node *cur = head;
? ? for (; cur != NULL; cur = cur->next)
? ? {
? ? ? ? cout << "data: " << cur->data << endl;
? ? }
}
int main(int argc, char* argv[])
{
? ? Node *head = NULL;
? ? int array[] = {1, 3, 5, 7, 9, 10, 8, 6, 4, 2};
? ? cout << endl << "Construct!" << endl << endl;
? ? head = Construct(array, 10);
? ? Print(head);
? ? cout << endl << "Reverse!" << endl << endl;
? ? head = Reverse(head);
? ? Print(head);
? ? cout << endl << "Reverse2!" << endl << endl;
? ? head = Reverse2(head);
? ? Print(head);
? ? cout << endl << "Destruct!" << endl << endl;
? ? Destruct(head);
? ? head = NULL;
? ? Print(head);
? ? return 0;
}
總結(jié)
以上是生活随笔為你收集整理的链表反转的两种实现方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 命令行下载利器- Aria2
- 下一篇: 管道读写