数据结构 - 反转单链表(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
*/
#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
*/
相关文章推荐
- 数据结构 带头结点的单链表 操作大全 最全的链表操作(c++实现)
- 计蒜客 数据结构 链表——约瑟夫环 C++
- c++实现数据结构4.双循环链表
- 链表反转 C++
- c++实现链表反转
- (数据结构)线性表_单链表反转 _模仿
- 数据结构的基础-单向链表所构造的栈 c++实现
- 【链表】C++链表反转、链表逆序打印
- 数据结构 - 双链表(C++)
- 【数据结构】 单链表的基本操作+反转+选择/直接插入/冒泡3种排序
- C/C++版数据结构之链表<二>
- 数据结构练习(17)反转链表
- 经典的数据结构——数组反转、链表反转、冒泡排序
- C++ - PAT - 1025. 反转链表 (25)
- 【C++】反转链表
- C/C++、JAVA 数据结构 :双向循环链表
- c++初级 之 反转链表
- 【编程题目】反转链表(C++实现)
- 计蒜客 数据结构 链表 C++
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)