链表操作

本文详细介绍了链表的基本操作,包括单链表的逆置与合并方法。通过头插法建立链表,并使用不同的算法实现链表结点的逆置,最后展示如何合并两个已排序的链表。内容涵盖了链表数据结构的基础知识,适用于计算机科学领域的学习者。
摘要由CSDN通过智能技术生成




 

24、链表操作



题目:

链表操作,
(1)单链表就地逆置,
(2)合并链表





  1. #include <cstdio>  
  2. #include <stdlib.h>  
  3.   
  4. typedef struct node  
  5. {  
  6.     struct node *next;  
  7.     int value;  
  8. }LinkList;  
  9.   
  10. void CreateList(LinkList *L);  
  11. void Reverse(LinkList *L);  
  12. void Output(LinkList *L);  
  13.   
  14. int main()  
  15. {  
  16.     LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点  
  17.     L->next=NULL;  
  18.   
  19.     CreateList(L);  
  20.     printf("Before reverse,the items are: \n");  
  21.     Output(L);  
  22.   
  23.     Reverse(L);  
  24.     printf("After reverse,the items are:  \n");  
  25.     Output(L);  
  26.   
  27.     return 0;  
  28. }  
  29.   
  30. void CreateList(LinkList *L) //头插法建立单链表  
  31. {  
  32.     int value;  
  33.     LinkList *tail=L,*newNode=NULL; //tail为链表尾结点  
  34.     printf("Please input values:\n");  
  35.     while (scanf("%d",&value)!=EOF)  
  36.     {  
  37.         newNode=(LinkList*)malloc(sizeof(LinkList));  
  38.         newNode->value=value;  
  39.         newNode->next=NULL;  
  40.   
  41.         tail->next=newNode;  
  42.         tail=newNode;  
  43.     }  
  44. }  
  45.   
  46. void Reverse(LinkList *L)  //把链表结点拆开,重新按尾插法建立单链表  
  47. {  
  48.     LinkList*tail=L->next,*head=NULL,*s=NULL;  //tail为链表尾部,head为断开的链表头结点,s为head后一个结点  
  49.   
  50.     if (tail==NULL)  
  51.     {  
  52.         return;  
  53.     }  
  54.     head=tail->next;  
  55.     tail->next=NULL;  
  56.   
  57.     while (head!=NULL)  
  58.     {  
  59.         s=head->next;  
  60.         head->next=tail;  
  61.         L->next=head;  
  62.         tail=head;  
  63.   
  64.         head=s;  
  65.     }  
  66. }  
  67.   
  68. void Output(LinkList *L)  
  69. {  
  70.     LinkList *r=L->next;  
  71.     while (r!=NULL)  
  72.     {  
  73.         printf("%d  ",r->value);  
  74.         r=r->next;  
  75.     }  
  76.     printf("\n");  
  77. }  

解释一下逆置算法:



还有一种方法:


从一本书上截了一张图


关键代码如下:

[cpp]  view plain copy
  1. LinkList *p=head,*q;  
  2.     head=NULL;  
  3.     while (p!=NULL)  
  4.     {  
  5.         q=p->next;  
  6.         p->next=head;  
  7.         head=p;  
  8.         p=q;  
  9.     }  


给出完整代码:

[cpp]  view plain copy
  1. #include <cstdio>  
  2. #include <stdlib.h>  
  3.   
  4. typedef struct node  
  5. {  
  6.     struct node *next;  
  7.     int value;  
  8. }LinkList;  
  9.   
  10. void CreateList(LinkList *L);  
  11. void Reverse(LinkList *L);  
  12. void Output(LinkList *L);  
  13.   
  14. int main()  
  15. {  
  16.     LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点  
  17.     L->next=NULL;  
  18.   
  19.     CreateList(L);  
  20.     printf("Before reverse,the items are: \n");  
  21.     Output(L);  
  22.   
  23.     Reverse(L);  
  24.     printf("After reverse,the items are:  \n");  
  25.     Output(L);  
  26.   
  27.     return 0;  
  28. }  
  29.   
  30. void CreateList(LinkList *L) //头插法建立单链表  
  31. {  
  32.     int value;  
  33.     LinkList *tail=L,*newNode=NULL; //tail为链表尾结点  
  34.     printf("Please input values:\n");  
  35.     while (scanf("%d",&value)!=EOF)  
  36.     {  
  37.         newNode=(LinkList*)malloc(sizeof(LinkList));  
  38.         newNode->value=value;  
  39.         newNode->next=NULL;  
  40.   
  41.         tail->next=newNode;  
  42.         tail=newNode;  
  43.     }  
  44. }  
  45.   
  46. void Reverse(LinkList *L)  //把链表结点拆开,重新按尾插法建立单链表  
  47. {  
  48.     LinkList*head=L->next,*p=NULL,*q=NULL;  //tail为链表尾部,head为断开的链表头结点,s为head后一个结点  
  49.   
  50.     if (head==NULL)  
  51.     {  
  52.         return;  
  53.     }  
  54.   
  55.     p=head;  
  56.     head=NULL;  
  57.     while (p!=NULL)  
  58.     {  
  59.         q=p->next;  
  60.         p->next=head;  
  61.         head=p;  
  62.   
  63.         if (q==NULL)  //如果p为最后一个结点,则把头结点指向它  
  64.         {  
  65.             L->next=p;  
  66.         }  
  67.   
  68.         p=q;  
  69.     }  
  70. }  
  71.   
  72. void Output(LinkList *L)  
  73. {  
  74.     LinkList *r=L->next;  
  75.     while (r!=NULL)  
  76.     {  
  77.         printf("%d  ",r->value);  
  78.         r=r->next;  
  79.     }  
  80.     printf("\n");  
  81. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值