王道P37 T5
所谓原地逆置,就是空间复杂度为O(1)的将链表反转。
实现函数:
void reverse(LinkList* L){ LinkList* after=NULL; LinkList* pre=NULL; LinkList* p=L->next; while(p){ after=p->next; p->next=pre; L->next=p; pre=p; p=after; } }
完整代码:
#include <cstdio> #include <stdlib.h> using namespace std; typedef struct LinkList{ int data; struct LinkList* next=NULL; LinkList(){ } LinkList(int x){ data=x; } }LinkList; LinkList* build_list(int * arr,int n){ int i; LinkList* L=new LinkList; LinkList* pre=L; for(i=0;i<n;i++){ LinkList* p=new LinkList(arr[i]); pre->next=p; pre=p; } return L; } void reverse(LinkList* L){ LinkList* after=NULL; LinkList* pre=NULL; LinkList* p=L->next; while(p){ after=p->next; p->next=pre; L->next=p; pre=p; p=after; } } void show_list(LinkList* L){ LinkList * p=L->next; while(p){ printf("%d ",p->data); p=p->next; } puts(""); } int main(){ int arr[10]={1,2,3,4,5,6,7,8,9,0}; LinkList * L=build_list(arr,10); // printf("%d ",L->next->data); show_list(L); reverse(L); show_list(L); }