单链表反转
题目描述:
/*
设计一个算法,通过一趟遍历,将链表中所有的链接方向反转,
仍利用原表的空间
*/
设计一个算法,通过一趟遍历,将链表中所有的链接方向反转,
仍利用原表的空间
*/
思想:
先将链表的头结点指针域置空,p指向链表的第一个结点;
q指向*p的后继,然后将*p插入到头结点的后面。
先将链表的头结点指针域置空,p指向链表的第一个结点;
q指向*p的后继,然后将*p插入到头结点的后面。
void TurnList(LinkList &L){ struct LNode *p; p=L->next; L->next=NULL; while(p){ struct LNode *q; q=p->next;//q指向*p的后继 p->next=L->next; L->next=p;//将*p插入到头结点之后 p=q; } }
具体实现:
#include<stdio.h> #include<iostream> using namespace std; #define MAX 100 typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; int InitList(LinkList &L){ L=new LNode; L->next=NULL; return 1; } void TraveList(LinkList L){ struct LNode *p; p=L->next; printf("遍历链表:\n"); while(p){ printf("%d ",p->data); p=p->next; } printf("\n"); } //前插法创建单链表 void CreateList(LinkList &L,int n){ L=new LNode; L->next=NULL; for(int i=n;i>0;--i){ printf("请输入第%d个元素的值:",i); struct LNode *p; p=new LNode; scanf("%d",&p->data); p->next=L->next; L->next=p; } } /* 思想: 先将链表的头结点指针域置空,p指向链表的第一个结点; q指向*p的后继,然后将*p插入到头结点的后面。 */ void TurnList(LinkList &L){ struct LNode *p; p=L->next; L->next=NULL; while(p){ struct LNode *q; q=p->next;//q指向*p的后继 p->next=L->next; L->next=p;//将*p插入到头结点之后 p=q; } } int main(){ LinkList L; if(InitList(L)){ printf("链表初始化成功!\n"); }else{ printf("链表初始化失败!\n"); } printf("请输入链表的长度:\n"); int n; scanf("%d",&n); CreateList(L,n); TraveList(L); printf("反转后的链表:\n"); TurnList(L); TraveList(L); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。