单链表反转C语言实现

来源:互联网 发布:淘宝直通车基础 编辑:程序博客网 时间:2024/05/24 15:39

单链表反转,面试常见题目:

#include <conio.h>#include <stdlib.h>#include <stdio.h>#define ERROR -1#define OK 1typedef int ElemType;typedef int Status;typedef struct LNode{ElemType data;LNode *next;}LNode,*LinkList;Status GetElem(LinkList L,int i,ElemType &e){LinkList p;p=L->next;int j=1;while(p&&j<i){p=p->next;++j;}if (!p||j>i)return ERROR;e=p->data;return OK; }Status ListInsert(LinkList L,int i,ElemType e){LinkList p,s;p=L;int j=0;while (p&&j<i-1){p=p->next;++j;}s=(LinkList)malloc(sizeof(LNode));if (!s)return ERROR;s->data=e;s->next=p->next;p->next=s;return OK;}Status ListDelete(LinkList &L,int i,ElemType &e){LinkList p,q;p=L;int j=0;while(p&&j<i-1){p=p->next;++j;}if (!(p->next)||j>i-1)return ERROR;q=p->next;p->next=q->next;e=q->data;free(q);return OK;}void CreateList(LinkList &L,int n){LinkList p;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;for(int i=n;i>0;i--){p=(LinkList)malloc(sizeof(LNode));printf("请输入第%d个元素\n",i);scanf("%d",&p->data);p->next=L->next;L->next=p;}}//链表反转//利用三个指针,pre只向前一个节点,确定指针更改后的指向位置,//cur指向当前节点,用来修改指针方向,ne指向下一个节点,是三个指针前进。//空间复杂度为O(3),事件复杂度为O(n)int ReverseList(LinkList &L){LinkList pre,cur,ne;if (L==NULL||L->next==NULL)return ERROR;pre=L;cur=pre->next;pre=NULL;//尾指针为空while(cur){ne=cur->next;//前进cur->next=pre;pre=cur;//前进cur=ne;//前进}L->next=pre;//新头指针return OK;}void main(){LinkList L,p;ElemType e;int n,m;printf("元素个数:\n");scanf("%d",&n);CreateList(L,n);printf("得到第几个元素:\n");scanf("%d",&m);GetElem(L,m,e);printf("元素为%d\n",e);printf("删除第几个元素\n");scanf("%d",&m);ListDelete(L,m,e);printf("删除的元素为%d\n",e);printf("第几个位置添加元素:\n");scanf("%d %d",&m,&e);ListInsert(L,m,e);printf("输出列表:\n");p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("链表反转后的结果:\n");ReverseList(L);p=L->next;while(p){printf("%d ",p->data);p=p->next;}getch();}


原创粉丝点击