您的位置:首页 > 其它

(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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单链表反转