带头节点单链表的反转(递归和非递归的实现)

mac2025-10-19  5

#include<iostream> using namespace std; typedef class student { public: int scores; student *next; }*List,lists; void reverse_list(List L,int k); //k 代表反转几个节点 void printlist(List L) ;//递归打印 void insert_List(List L,int e);//插入 void creat(List &L); void dg_reverse(List L,List &temp,List head);//带头节点的单链表的反转递归 L为 int main() { List L=new lists; L=NULL; creat(L); for(int i=1;i<=7;i++) { insert_List(L,i); } printlist(L); cout<<endl; /*cout<<"你想反转几个节点呢"<<endl; int k; cin>>k; reverse_list(L,k); printlist(L);*/ List temp,head=L; dg_reverse(L,temp,head); printlist(L); cout<<endl; return 0; } void creat(List &L) { if(L==NULL) { List s=new lists; s->next=NULL; L=s; } } void insert_List(List L,int e)//插入 { while(L->next!=NULL) { L=L->next; } List s=new lists; s->next=L->next; s->scores=e; L->next=s; } void printlist(List L) //递归打印 { if(L->next==NULL) { return ; } else { cout<<L->next->scores<<" "; printlist(L->next); } } void reverse_list(List L,int k) //k 代表反转几个节点 (非递归) { int i=1; List news=L->next; List pre_news=news;//把第一个节点保存起来 List old=news->next; List temp; while(i<k) { temp=old->next; old->next=news; news=old; old=temp; i++; } pre_news->next=temp; L->next=news; //关键点 } void dg_reverse(List L,List &temp,List head)//带头节点的单链表的反转递归 L为 { if(L->next==NULL) { temp=L; } if(L->next!=NULL) { dg_reverse(L->next,temp,head); if(head!=L) { L->next->next=L; L->next=NULL; } else { L->next=temp; } } }
最新回复(0)