链表操作
来源:互联网 发布:java 招聘 大街 编辑:程序博客网 时间:2024/04/30 07:53
24、链表操作
题目:
链表操作,
(1)单链表就地逆置,
(2)合并链表
- #include <cstdio>
- #include <stdlib.h>
- typedef struct node
- {
- struct node *next;
- int value;
- }LinkList;
- void CreateList(LinkList *L);
- void Reverse(LinkList *L);
- void Output(LinkList *L);
- int main()
- {
- LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点
- L->next=NULL;
- CreateList(L);
- printf("Before reverse,the items are: \n");
- Output(L);
- Reverse(L);
- printf("After reverse,the items are: \n");
- Output(L);
- return 0;
- }
- void CreateList(LinkList *L) //头插法建立单链表
- {
- int value;
- LinkList *tail=L,*newNode=NULL; //tail为链表尾结点
- printf("Please input values:\n");
- while (scanf("%d",&value)!=EOF)
- {
- newNode=(LinkList*)malloc(sizeof(LinkList));
- newNode->value=value;
- newNode->next=NULL;
- tail->next=newNode;
- tail=newNode;
- }
- }
- void Reverse(LinkList *L) //把链表结点拆开,重新按尾插法建立单链表
- {
- LinkList*tail=L->next,*head=NULL,*s=NULL; //tail为链表尾部,head为断开的链表头结点,s为head后一个结点
- if (tail==NULL)
- {
- return;
- }
- head=tail->next;
- tail->next=NULL;
- while (head!=NULL)
- {
- s=head->next;
- head->next=tail;
- L->next=head;
- tail=head;
- head=s;
- }
- }
- void Output(LinkList *L)
- {
- LinkList *r=L->next;
- while (r!=NULL)
- {
- printf("%d ",r->value);
- r=r->next;
- }
- printf("\n");
- }
解释一下逆置算法:
还有一种方法:
从一本书上截了一张图
关键代码如下:
- LinkList *p=head,*q;
- head=NULL;
- while (p!=NULL)
- {
- q=p->next;
- p->next=head;
- head=p;
- p=q;
- }
给出完整代码:
- #include <cstdio>
- #include <stdlib.h>
- typedef struct node
- {
- struct node *next;
- int value;
- }LinkList;
- void CreateList(LinkList *L);
- void Reverse(LinkList *L);
- void Output(LinkList *L);
- int main()
- {
- LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点
- L->next=NULL;
- CreateList(L);
- printf("Before reverse,the items are: \n");
- Output(L);
- Reverse(L);
- printf("After reverse,the items are: \n");
- Output(L);
- return 0;
- }
- void CreateList(LinkList *L) //头插法建立单链表
- {
- int value;
- LinkList *tail=L,*newNode=NULL; //tail为链表尾结点
- printf("Please input values:\n");
- while (scanf("%d",&value)!=EOF)
- {
- newNode=(LinkList*)malloc(sizeof(LinkList));
- newNode->value=value;
- newNode->next=NULL;
- tail->next=newNode;
- tail=newNode;
- }
- }
- void Reverse(LinkList *L) //把链表结点拆开,重新按尾插法建立单链表
- {
- LinkList*head=L->next,*p=NULL,*q=NULL; //tail为链表尾部,head为断开的链表头结点,s为head后一个结点
- if (head==NULL)
- {
- return;
- }
- p=head;
- head=NULL;
- while (p!=NULL)
- {
- q=p->next;
- p->next=head;
- head=p;
- if (q==NULL) //如果p为最后一个结点,则把头结点指向它
- {
- L->next=p;
- }
- p=q;
- }
- }
- void Output(LinkList *L)
- {
- LinkList *r=L->next;
- while (r!=NULL)
- {
- printf("%d ",r->value);
- r=r->next;
- }
- printf("\n");
- }
- 实现链表基本操作(简单操作)
- 链表操作源程序
- 链表操作
- C++ 链表操作
- 链表的操作
- 链表操作源程序
- 链表的操作
- 链表的操作
- C++链表操作
- 链表操作
- 链表操作
- 链表基本操作
- LinkList链表操作
- 合并链表操作
- 链表简单操作
- 链表的操作
- 链表操作
- 操作链表
- MD5加密(输出后为大写字母)
- Iphone开发(十二)通过xib文件自定义列表中的行
- Unable to open kernel device "\\.\vmci"
- 字符串反转
- 找二叉树中两个节点的最近的公共父节点
- 链表操作
- 关于交叉线和直通线的区别和用途
- 24位bmp转化为 565或者888C语言数组文件
- 在字符串中找出连续最长的数字串
- C# 在datatable中进行行列的转置
- 【编程语言】C++ 中的placement new
- Code Page Identifiers
- 没有找到MFC42D.DLL,因此这个应用程序未能启动
- 左旋转字符串