《数据结构教程》(李春葆 主编)课后习题【2.4】

【2.4】

设计一个算法,将一个带头节点的数据域依次为a1,a2,……,an(n>=3)的单链表的所有节点逆置,即第一个节点的数据域变为an,……,最后一个节点的数据域变为a1。


 

  思路:我是直接在原链表上操作,当然也可以创建一个数组存储链表的数据,然后再倒序放回原链表。

  答案

 

 1 void invert(LinkList *&head)    //逆置链表处理 

 2 {  3     LinkList* p = head->next;  4     LinkList* pri = NULL;    //之前的节点 

 5     while(p){  6         LinkList* q = new LinkList;  7         q->data = p->data;    //把当前节点记录下来 

 8         q->next = pri;  9         pri = q; 10         head->next = q; 11         LinkList* t = p;    //当前节点没用了删除掉 

12         p=p->next; 13  delete(t); 14  } 15 }

 

  测试代码

 1 //链表逆置  2 //思路是遍历原链表,不断将当前节点以头插法插到head头节点后面,以此实现逆置 

 3 

 4 #include <iostream>

 5 using namespace std;  6 #define Max 10 

 7 struct LinkList{  8     int data;  9     LinkList* next; 10 }; 11 void CreateLinkList(int a[],int n,LinkList* &head)        //创建一个链表,把a数组中的数据依次放进去 

12 { 13     LinkList *p = head; 14     for(int i=0;i<n;i++){ 15         LinkList *q = new LinkList; 16         q->data = a[i]; 17         q->next = NULL; 18         p->next = q; 19         p = q; 20  } 21 } 22 void Display(LinkList *&head)    //输出链表 

23 { 24     LinkList *p = head->next; 25     while(p!=NULL){ 26         cout<<p->data<<' '; 27         p=p->next; 28  } 29     cout<<endl; 30 } 31 void invert(LinkList *&head)    //逆置链表处理 

32 { 33     LinkList* p = head->next; 34     LinkList* pri = NULL;    //之前的节点 

35     while(p){ 36         LinkList* q = new LinkList; 37         q->data = p->data;    //把当前节点记录下来 

38         q->next = pri; 39         pri = q; 40         head->next = q; 41         LinkList* t = p;    //当前节点没用了删除掉 

42         p=p->next; 43  delete(t); 44  } 45 } 46 int main() 47 { 48     int a[Max],n=Max; 49     for(int i=0;i<Max;i++) 50         a[i] = i+1; 51     LinkList *head = new LinkList; 52     CreateLinkList(a,n,head);    //将数组a中的元素顺序创建成一个链表 

53     Display(head);    //输出该链表 

54     invert(head);    //将该链表逆置处理 

55     Display(head);    //输出处理后的链表 

56     return 0; 57 }

 

Freecode : www.cnblogs.com/yym2013

你可能感兴趣的:(数据结构)