【算法设计-单链表的逆转】单链表逆转实现
2015-05-07 20:32
549 查看
1.在Θ(n)时间内将链表转置,而且只能需要少量的额外空间
这里需要用3个指针使得q指向p然后依次后移。
代码:
#include<iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}LinkList;
LinkList* Create_End();
void printLinkList(LinkList *L);
LinkList* Create_End()
{
LinkList *head, *e, *p;
head=new LinkList;
int key;
e = head;
printf("请输入您要插入的数据,#结束!\n");
while (scanf("%d",&key)==1)
{
p = new LinkList;
p->data = key;
e->next = p;
e = p;
}
e->next = NULL;
return head;
}
void printLinkList(LinkList *L)
{
LinkList *p = L->next;
while (p->next != NULL)
{
printf("%d->", p->data);
p = p->next;
}
printf("%d", p->data);
printf("\n");
}
LinkList* reverse(LinkList *L)
{
LinkList* p,*q,*r;
p=L->next;
q=p->next;
r=q->next;
p->next=NULL;
while(r->next!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
r->next=q;
L->next=r;
return L;
}
int main(void)
{
LinkList *Linklist1=new LinkList;
Linklist1=Create_End();
printLinkList(Linklist1);
printf("转换后的链表为:");
Linklist1=reverse(Linklist1);
printLinkList(Linklist1);
}
这里需要用3个指针使得q指向p然后依次后移。
代码:
#include<iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
}LinkList;
LinkList* Create_End();
void printLinkList(LinkList *L);
LinkList* Create_End()
{
LinkList *head, *e, *p;
head=new LinkList;
int key;
e = head;
printf("请输入您要插入的数据,#结束!\n");
while (scanf("%d",&key)==1)
{
p = new LinkList;
p->data = key;
e->next = p;
e = p;
}
e->next = NULL;
return head;
}
void printLinkList(LinkList *L)
{
LinkList *p = L->next;
while (p->next != NULL)
{
printf("%d->", p->data);
p = p->next;
}
printf("%d", p->data);
printf("\n");
}
LinkList* reverse(LinkList *L)
{
LinkList* p,*q,*r;
p=L->next;
q=p->next;
r=q->next;
p->next=NULL;
while(r->next!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
q->next=p;
r->next=q;
L->next=r;
return L;
}
int main(void)
{
LinkList *Linklist1=new LinkList;
Linklist1=Create_End();
printLinkList(Linklist1);
printf("转换后的链表为:");
Linklist1=reverse(Linklist1);
printLinkList(Linklist1);
}
相关文章推荐
- 设单链表以非递减有序排列,设计算法实现在单链表中删去值相同的多余结点。
- 单链表和双链表 算法与实现
- 设单链表以非递减有序排列,设计算法实现在单链表中删除值相同的多余结点
- 面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
- 从键盘读入n个整数(升序),请编写算法实现: 建立带表头结点的单链表; 显示单链表,(形如:H->10->20->30->40); 在有序单链表中插入新的数据元素x; 将单链表就地逆
- 单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)
- 单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- [Java算法分析与设计]单向链表(List)的实现和应用
- 给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m=0时,链表的
- 设ha和hb分别是两个带头节点的费递减有序单链表的表头指针,设计以算法,将将两个有序链表合成一个非递减的有序单链表,该程序以以前发表的博客中的链表中的区别在与该立案表带有头结点
- [算法]Java 实现 简单MyNode类型 无序链表 递归 添加 删除 遍历
- 试分别以顺序表和单链表作存储结构,各写一实现线性表就地逆置的算法
- 【LeetCode-面试算法经典-Java实现】【143-Copy List with Random Pointer(有随机指针的链表复制)】
- 一步一步写算法(之链表逆转)
- 链表实现学生管理系统 -文件 4000 的储存与读入-2018年春课程设计
- 算法设计和数据结构学习_6(单链表的递归逆序)
- 【LeetCode-面试算法经典-Java实现】【147-Insertion Sort List(链表插入排序)】
- 【算法设计-链表】单链表与双向循环链表
- 单链表实现删除最小节点的算法