(28)单链表的两种反转方法
2017-04-28 15:53
357 查看
一.将原链表的节点按照顺序一个一个插入到新链表中。
代码:
Linkedlist Reversal(Linkedlist head) {
Linkedlist newNode = NULL;
for (Linkedlist p = head; p;) {
Linkedlist temp = p->next; //保存前一结点
p->next = newNode;
newNode = p;
p = temp;
}
return newNode;
}
完整代码:
typedef struct Node{
int data;
struct Node *next;
}LNode,*Linkedlist;
void listInit(Linkedlist &list) {
Linkedlist pre,p;
list = (Linkedlist)malloc(sizeof(Linkedlist));
list->data = 1;
pre = list;
for (int i = 1; i < 5; i++) {
p= (Linkedlist)malloc(sizeof(Linkedlist));
p->data = i+1;
pre->next = p;
pre = p;
}
p->next = NULL;
}
Linkedlist Reversal(Linkedlist head) {
Linkedlist newNode = NULL;
for (Linkedlist p = head; p;) {
Linkedlist temp = p->next;
p->next = newNode;
newNode = p;
p = temp;
}
return newNode;
}
void main() {
Linkedlist list,p;
listInit(list);
p = list;
cout << "原单链表为:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
p = Reversal(list);
cout << "反转的链表的是:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
system("pause");
}
二. 利用栈先进后出的特性
typedef struct Node{
int data;
struct Node *next;
}LNode,*Linkedlist;
void listInit(Linkedlist &list) {
Linkedlist pre,p;
list = (Linkedlist)malloc(sizeof(Linkedlist));
list->data = 1;
pre = list;
for (int i = 1; i < 5; i++) {
p= (Linkedlist)malloc(sizeof(Linkedlist));
p->data = i+1;
pre->next = p;
pre = p;
}
p->next = NULL;
}
Linkedlist Reversal(Linkedlist head) {
stack<Linkedlist> temp;
Linkedlist p=head, list=NULL,newNode;
while (p->next != NULL) { //将全部节点压栈
temp.push(p);
p = p->next;
}
temp.push(p);
list = newNode = temp.top(); // list记录前节点, newNode则记录头结点
temp.pop(); //将头元素出栈
while (temp.size()!= 0) {
p = temp.top();
list->next = p; //将前一节点的next指向当前节点
list = p;
temp.pop();
}
list->next = NULL;
return newNode;
}
void main() {
Linkedlist list,p;
listInit(list);
p = list;
cout << "原单链表为:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
p = Reversal(list);
cout << "反转的链表的是:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
system("pause");
}
代码:
Linkedlist Reversal(Linkedlist head) {
Linkedlist newNode = NULL;
for (Linkedlist p = head; p;) {
Linkedlist temp = p->next; //保存前一结点
p->next = newNode;
newNode = p;
p = temp;
}
return newNode;
}
完整代码:
typedef struct Node{
int data;
struct Node *next;
}LNode,*Linkedlist;
void listInit(Linkedlist &list) {
Linkedlist pre,p;
list = (Linkedlist)malloc(sizeof(Linkedlist));
list->data = 1;
pre = list;
for (int i = 1; i < 5; i++) {
p= (Linkedlist)malloc(sizeof(Linkedlist));
p->data = i+1;
pre->next = p;
pre = p;
}
p->next = NULL;
}
Linkedlist Reversal(Linkedlist head) {
Linkedlist newNode = NULL;
for (Linkedlist p = head; p;) {
Linkedlist temp = p->next;
p->next = newNode;
newNode = p;
p = temp;
}
return newNode;
}
void main() {
Linkedlist list,p;
listInit(list);
p = list;
cout << "原单链表为:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
p = Reversal(list);
cout << "反转的链表的是:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
system("pause");
}
二. 利用栈先进后出的特性
typedef struct Node{
int data;
struct Node *next;
}LNode,*Linkedlist;
void listInit(Linkedlist &list) {
Linkedlist pre,p;
list = (Linkedlist)malloc(sizeof(Linkedlist));
list->data = 1;
pre = list;
for (int i = 1; i < 5; i++) {
p= (Linkedlist)malloc(sizeof(Linkedlist));
p->data = i+1;
pre->next = p;
pre = p;
}
p->next = NULL;
}
Linkedlist Reversal(Linkedlist head) {
stack<Linkedlist> temp;
Linkedlist p=head, list=NULL,newNode;
while (p->next != NULL) { //将全部节点压栈
temp.push(p);
p = p->next;
}
temp.push(p);
list = newNode = temp.top(); // list记录前节点, newNode则记录头结点
temp.pop(); //将头元素出栈
while (temp.size()!= 0) {
p = temp.top();
list->next = p; //将前一节点的next指向当前节点
list = p;
temp.pop();
}
list->next = NULL;
return newNode;
}
void main() {
Linkedlist list,p;
listInit(list);
p = list;
cout << "原单链表为:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
p = Reversal(list);
cout << "反转的链表的是:";
while (p->next != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << p->data << endl;
system("pause");
}
相关文章推荐
- 单链表反转/逆序的两种方法
- 【转】JAVA实现两种方法反转单链表
- 单链表反转的两种方法
- 单链表反转/逆序的两种方法
- 单链表反转/逆序的两种方法
- 剑指offer_面试题16_反转链表(两种方法)
- 反转单链表的几种方法
- C#反转字符串的两种方法
- 反转单链表的几种方法
- JAVA实现两种方法反转单列表
- 黑马程序员一集合比较器的两种反转方法
- php反转输出字符串(两种方法)
- 反转单链表的几种方法
- 链表反转的两种实现方法
- C语言两种方法实现字符串反转
- 单链表反转/逆序的三种方法(整理)
- 反转单链表的四种方法
- 判断单链表是否有环的两种方法
- 【C语言】用递归和循环两种方法实现单链表倒置
- 反转一个链表的两种方法:递归和循环