您的位置:首页 > 理论基础 > 数据结构算法

数据结构 - 反转单链表(C++)

2012-07-02 18:41 288 查看
// 反转单链表的循环算法(C++)

#include <iostream>

#define NULL 0

using namespace std;

struct Node
{
char data;
Node* next;
};

Node* create()
{
Node* head = NULL;
Node* rear = head;
Node* p; // The pointer points to new created node.
char tmp;

do
{
cout << "Please input positive integer or #:";
cin >> tmp;
if(tmp != -1)
{
p = new Node;
p->data = tmp;
p->next = NULL;

if(head == NULL)
{
head = p;
}
else
{
rear->next = p;
}
rear = p;
}
}
while(tmp != '#');

return head;
}

void print(Node* head)
{
cout << "The current list is: ";
Node* p = head;
if(head != NULL)
{
do
{
cout << p->data << cout << ' ';
p = p->next;
}
while(p != NULL);
}
cout << "\r\n";
}

void reverse(Node*& head) // Use & here since the function body changed the head pointer.
{
if(head == NULL)
{
return;
}

Node*pre, *cur, *ne;
pre = head;
cur = head->next;
while(cur)
{
ne = cur->next; // Store next pointer.
cur->next = pre; // Reverse the current code pointer.
pre = cur;
cur = ne;
}

head->next = NULL;
head = pre;
}

int main()
{
Node* list = create();
print(list);
reverse(list);
print(list);

return 0;
}

// Output:
/*
Please input positive integer or #:1
Please input positive integer or #:5
Please input positive integer or #:8
Please input positive integer or #:3
Please input positive integer or #:2
Please input positive integer or #:7
Please input positive integer or #:9
Please input positive integer or #:f
Please input positive integer or #:g
Please input positive integer or #:t
Please input positive integer or #:Y
Please input positive integer or #:B
Please input positive integer or #:#
The current list is: 10FC0C3E8 50FC0C3E8 80FC0C3E8 30FC0C3E8 20FC0C3E8 70FC0C3E8 90FC0C3E8 f0FC0C3E8 g0FC0C3E8 t0FC0C3E8 Y0FC0C3E8 B0FC0C3E8 #0FC0C3E8
The current list is: #0FC0C3E8 B0FC0C3E8 Y0FC0C3E8 t0FC0C3E8 g0FC0C3E8 f0FC0C3E8 90FC0C3E8 70FC0C3E8 20FC0C3E8 30FC0C3E8 80FC0C3E8 50FC0C3E8 10FC0C3E8
*/

// 反转单链表的递归算法(C++)

#include <iostream>

#define NULL 0

using namespace std;

struct Node
{
char data;
Node* next;
};

Node* create()
{
Node* head = NULL;
Node* rear = head;
Node* p; // The pointer points to the new created node.
char tmp;

do
{
cout << "Please input integer or char '#':";
cin >> tmp;
if(tmp != '#')
{
p = new Node;
p->data = tmp;
p->next = NULL;

if(head == NULL)
{
head = p;
}
else
{
rear->next = p;
}
rear = p;
}
}
while(tmp != '#');

return head;
}

void print(Node* head)
{
cout << "The current list is: ";
Node* p = head;
if(head != NULL)
{
do
{
cout << p->data << cout << ' ';
p = p->next;
}
while(p != NULL);
}
cout << "\r\n";
}

Node* reverseSingleLinkedListRecursive(Node* p, Node*& head)
{
if(p == NULL || p->next == NULL)
{
head = p;
return p;
}

Node* tmp = reverseSingleLinkedListRecursive(p->next, head);
tmp->next = p;
p->next = NULL; // To prevent forming a ring.
return p;
}

int main()
{
Node* list = create();
print(list);
reverseSingleLinkedListRecursive(list, list);
print(list);

return 0;
}

// Output:
/*
Please input integer or char '#':1
Please input integer or char '#':2
Please input integer or char '#':4
Please input integer or char '#':6
Please input integer or char '#':3
Please input integer or char '#':8
Please input integer or char '#':7
Please input integer or char '#':9
Please input integer or char '#':0
Please input integer or char '#':#
The current list is: 10F69C3E8 20F69C3E8 40F69C3E8 60F69C3E8 30F69C3E8 80F69C3E8 70F69C3E8 90F69C3E8 00F69C3E8
The current list is: 00F69C3E8 90F69C3E8 70F69C3E8 80F69C3E8 30F69C3E8 60F69C3E8 40F69C3E8 20F69C3E8 10F69C3E8
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息