备注:常常看到有关单链表的逆序、合并问题,于是尝试用非递归及递归方法实现。
一、问题描述:
对给定没有头结点的单链表link,如何将其逆序,仍用link表示逆序结果。对没有头结点的各结点按数据域升序排列的单链表link1和link2,如何将其合并,使合并后的单链表也为升序,而单链表link1和link2销毁。设链表结点定义如下:
typedef struct NODE{
int data;
struct NODE *next;
}NODE;
二、链表逆序:
1. 非递归实现:
NODE *reverse_link(NODE *&link){
//link: pointer of first node of the origin link,
// after the reverse process is done points to the first node of the reversed link;
//return: pointer of the first node of the reversed link;
if(link!=NULL&&link->next!=NULL){
NODE *p1=link->next;
NODE *p2=p1->next;
link->next=NULL;
while(p2!=NULL){
p1->next=link;
link=p1;
p1=p2;
p2=p2->next;
}
p1->next=link;
link=p1;
}
return link;
}
2. 递归实现:
NODE *recursive_reverse_link(NODE *&link){
//link: pointer of the first node of the origin link,
// after the reverse process is done points to the first node of the reversed link;
//return: pointer of the last node of the reversed link;
if(link==NULL){
return NULL;
}else if(link->next==NULL){
return link;
}else{
NODE *temp1=link;
link=link->next;
NODE *temp2=recursive_reverse_link(link);
temp1->next=NULL;
temp2->next=temp1;
return temp1;
}
}
三、链表合并:
1. 非递归实现:
NODE *merge_link(NODE *&link1,NODE *&link2){
//link1: pointer of first node of the origin link1, after the merging process set to NULL;
//link2: pointer of first node of the origin link2, after the merging process set to NULL;
//return: pointer of first node of the merged link;
NODE *link;
if(link1==NULL){
link=link2;
}else if(link2==NULL){
link=link1;
}else{
if(link1->data<link2->data){
link=link1;
link1=link1->next;
}else{
link=link2;
link2=link2->next;
}
NODE *curr=link;
while(link1!=NULL&&link2!=NULL){
if(link1->data<link2->data){
curr->next=link1;
curr=link1;
link1=link1->next;
}else{
curr->next=link2;
curr=link2;
link2=link2->next;
}
}
if(link1==NULL){
curr->next=link2;
}
if(link2==NULL){
curr->next=link1;
}
}
link1=link2=NULL;
return link;
}
2. 递归实现:
NODE *recursive_merge_link(NODE *&link1,NODE *&link2){
NODE *link;
if(link1==NULL){
link=link2;
link2=NULL;
}else if(link2==NULL){
link=link1;
link1=NULL;
}else{
if(link1->data<link2->data){
link=link1;
link1=link1->next;
link->next=recursive_merge_link(link1,link2);
}else{
link=link2;
link2=link2->next;
link->next=recursive_merge_link(link1,link2);
}
}
return link;
}
四、测试:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef struct NODE{
int data;
struct NODE *next;
}NODE;
void create_link(NODE *&link,int size);
void destroy_link(NODE *&link);
void print_link(const NODE *link);
NODE *reverse_link(NODE *&link);
NODE *recursive_reverse_link(NODE *&link);
NODE *merge_link(NODE *&link1,NODE *&link2);
NODE *recursive_merge_link(NODE *&link1,NODE *&link2);
int main(int argc,char *argv[]){
NODE *link1=NULL;
NODE *link2=NULL;
NODE *link_m=NULL;
int size=5;
create_link(link1,size);
create_link(link2,size);
print_link(link1);
print_link(link2);
reverse_link(link1);
recursive_reverse_link(link2);
print_link(link1);
print_link(link2);
reverse_link(link1);
recursive_reverse_link(link2);
print_link(link1);
print_link(link2);
link_m=recursive_merge_link(link1,link2);
//link_m=merge_link(link1,link2);
print_link(link_m);
print_link(link1);
print_link(link2);
destroy_link(link1);
destroy_link(link2);
destroy_link(link_m);
}
void create_link(NODE *&link,int size){
if(size<1){
return;
}
if((link=(NODE*)malloc(sizeof(NODE)))!=NULL){
link->data=size;
link->next=NULL;
}else{
exit(0);
}
NODE *temp=NULL;
while(--size>0){
if((temp=(NODE*)malloc(sizeof(NODE)))!=NULL){
temp->data=size;
temp->next=link;
link=temp;
}else{
destroy_link(link);
exit(0);
}
}
return;
}
void destroy_link(NODE *&link){
NODE *temp=NULL;
while(link!=NULL){
temp=link;
link=link->next;
free(temp);
}
return;
}
void print_link(const NODE *link){
if(link!=NULL){
cout<<link->data;
while((link=link->next)!=NULL){
cout<<"->"<<link->data;
}
cout<<endl;
}
return;
}