链表实现逆置
2017-03-15 20:29
148 查看
以 1,2,3,4,5为举例
主要的算法部分:
p=L->next;//p指向L的下一个结点,即为1的位置
L->next=NULL;//把头结点和1之间断开
while(p!=NULL)//循环结束的条件
{
q=p;//Q也指向p的位置
p=p->next;//p再指向2的位置
q->next=L->next;//q的下一个指向空
L->next=q;//L的next再指向1(第一次的循环只把头指针和1先断开,再链接起来,其余以此类推)
}//这是算法的非递归实现
代码的具体实现://递归算法的实现
#include"stdio.h"
const int N=6;
typedef struct node
{
int data;
struct node *next;
}LinkedNode,*LinkList;
LinkList CreateList(int a[N])//创建一个单链表
{
LinkedNode *head=new LinkedNode();//清空头结点
head->data=a[0];//头结点放第一个数据
head->next=NULL;
for(int i=N-1;i>=1;i--)
{
LinkedNode *p=new LinkedNode();
p->data=a[i];//数据域存放数据
p->next=head->next;//指针域存放next的指针
head->next=p;
}
return head;
}
void PrintList(LinkList head)
{
if(NULL==head)
printf("The List is empty!\n");
else
{
LinkedNode *p=head;
while(p!=NULL)
{
printf("%d ",p->data);//输出一个数据
p=p->next;//指向下一个结点的位置
}
printf("\n");
}
}
void ReverseList(LinkedNode *pcur,LinkList &head)//链表逆置,头指针会发生变化
{
if(NULL==pcur||NULL==pcur->next)
head=pcur;
else
{
LinkedNode *pnext=pcur->next;//指向该数据的下一个数据的位置
ReverseList(pnext,head);
pnext->next=pcur;
pcur->next=NULL;
}
}
int main()
{
int a
={1,2,3,4,5,6};
LinkedNode *list=CreateList(a);//创建一个链表
PrintList(list);//输出该链表
LinkedNode *ptemp=list;
ReverseList(ptemp,list);
PrintList(list);//输出该链表
return 0;
}
主要的算法部分:
p=L->next;//p指向L的下一个结点,即为1的位置
L->next=NULL;//把头结点和1之间断开
while(p!=NULL)//循环结束的条件
{
q=p;//Q也指向p的位置
p=p->next;//p再指向2的位置
q->next=L->next;//q的下一个指向空
L->next=q;//L的next再指向1(第一次的循环只把头指针和1先断开,再链接起来,其余以此类推)
}//这是算法的非递归实现
代码的具体实现://递归算法的实现
#include"stdio.h"
const int N=6;
typedef struct node
{
int data;
struct node *next;
}LinkedNode,*LinkList;
LinkList CreateList(int a[N])//创建一个单链表
{
LinkedNode *head=new LinkedNode();//清空头结点
head->data=a[0];//头结点放第一个数据
head->next=NULL;
for(int i=N-1;i>=1;i--)
{
LinkedNode *p=new LinkedNode();
p->data=a[i];//数据域存放数据
p->next=head->next;//指针域存放next的指针
head->next=p;
}
return head;
}
void PrintList(LinkList head)
{
if(NULL==head)
printf("The List is empty!\n");
else
{
LinkedNode *p=head;
while(p!=NULL)
{
printf("%d ",p->data);//输出一个数据
p=p->next;//指向下一个结点的位置
}
printf("\n");
}
}
void ReverseList(LinkedNode *pcur,LinkList &head)//链表逆置,头指针会发生变化
{
if(NULL==pcur||NULL==pcur->next)
head=pcur;
else
{
LinkedNode *pnext=pcur->next;//指向该数据的下一个数据的位置
ReverseList(pnext,head);
pnext->next=pcur;
pcur->next=NULL;
}
}
int main()
{
int a
={1,2,3,4,5,6};
LinkedNode *list=CreateList(a);//创建一个链表
PrintList(list);//输出该链表
LinkedNode *ptemp=list;
ReverseList(ptemp,list);
PrintList(list);//输出该链表
return 0;
}
相关文章推荐
- 链表(LinkList)的设计与实现(初始化,创建,插入,删除,逆置)
- 单链表的逆置-C++实现
- 利用头插法实现单向链表的逆置
- 数据结构-链表逆置(c++模板类实现)
- 如何实现单向链表的逆置
- 使用STL之list实现链表逆置
- c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)
- 单链表逆置-新建链表(头插法实现)/原链表(逐个实现逆转)
- 单链表的逆置-C++实现(转载)
- 单链表(二):如何实现单链表的排序、逆置(逆序)
- 单链表的逆置-C++实现
- 单链表逆置的完整实现 java版
- 链表中插入数据元素x保持原有升序保持不变 / 就地逆置的实现(C)
- 单向链表逆置的功能实现
- 对单链表实现就地逆置
- 倒插法实现链表逆置
- 链表中插入数据元素x保持原有升序保持不变 / 就地逆置的实现(C)
- 实现就地逆置单链表
- 用JAVA实现:非递归算法在O(n)时间内将一个含有n个元素的单链表逆置,要求其辅助空间为常量
- 双向链表操作(逆置三种实现以及 冒泡排序 )