首页 > 代码库 > 单链表逆序或者逆序输出

单链表逆序或者逆序输出

分为两种情况,一种是只逆序输出,实际上不逆序;另一种是把链表逆序。

 

********************逆序输出***********************

 

 1 #include<iostream> 2 #include<stack> 3 #include<assert.h> 4 using namespace std; 5  6  7 typedef struct node{ 8     int data; 9     node * next;10 }node;11 12 //尾部添加13 node * add(int n, node * head){14     node * t = new node;15     t->data =http://www.mamicode.com/ n;16     t->next = NULL;17     if (head == NULL){18         head = t;19     }20     else if (head->next == NULL){21         head->next = t;22     }23     else{24         node * p = head->next;25         while (p->next != NULL){26             p = p->next;27         }28         p->next = t;29     }30     return head;31 }32 33 //顺序输出34 void print(node * head){35     node * p = head;36     while (p != NULL){37         cout << p->data << " ";38         p = p->next;39     }40     cout << endl;41 }42 43 //递归44 void reversePrint(node * p){45     if (p != NULL){46         reversePrint(p->next);47         cout << p->data << " ";48     }49 }50 51 //52 void reversePrint2(node * head){53     stack<int> s;54     while (head != NULL){55         s.push(head->data);56         head = head->next;57     }58 59     while (!s.empty()){60         cout << s.top() << " ";61         s.pop();62     }63 }64 65 int main(){66 67     node * head = NULL;68     for (int i = 1; i <= 5; i++){69         head = add(i, head);70     }71         print(head);72         reversePrint(head);73         reversePrint2(head);74     system("pause");75         return 0;76 }                

 

逆序输出可以用三种方法: 递归,栈,逆序后输出。最后一种接下来讲到。

 

*********************单链表逆序********************

 

 1 #include<iostream> 2 #include<stack> 3 #include<assert.h> 4 using namespace std; 5  6  7 typedef struct node{ 8     int data; 9     node * next;10 }node;11 12 node * add(int n, node * head){13     node * t = new node;14     t->data =http://www.mamicode.com/ n;15     t->next = NULL;16     if (head == NULL){17         head = t;18     }19     else if (head->next == NULL){20         head->next = t;21     }22     else{23         node * p = head->next;24         while (p->next != NULL){25             p = p->next;26         }27         p->next = t;28     }29     return head;30 }31 32 //循环33 node * reverse(node * head){34 35     if (head == NULL || head->next == NULL){36         return head;37     }38 39     node * p1 = head;40     node * p2 = head->next;41     node * p3 = NULL; 42     head->next = NULL;43 44     while (p2 != NULL){45         p3 = p2;46         p2 = p2->next;47         p3->next = p1;48         p1 = p3;49     }50     head = p1;51     return head;52 }53 54 void print(node * head){55     node * p = head;56     while (p != NULL){57         cout << p->data << " ";58         p = p->next;59     }60     cout << endl;61 }62 63 64 //递归65 node * reverse2(node * p){66     if (p == NULL || p->next == NULL){67         return p;68     }69 70     node * newHead = reverse2(p->next);71     p->next->next = p;72     p->next = NULL;73     return newHead;74 }75 76 77 int main(){78 79     node * head = NULL;80     for (int i = 1; i <= 5; i++){81         head = add(i, head);82     }83     print(head);84     head = reverse(head);85     print(head);86     head = reverse2(head);87     print(head);88 89     system("pause");90     return 0;91 }

 

这里链表逆序用了两种方法:循环,递归。理解的方法是在纸上自己画一下。

单链表逆序或者逆序输出