【算法设计-单链表的逆转】单链表逆转实现

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);

}

时间: 2024-08-02 06:22:52

【算法设计-单链表的逆转】单链表逆转实现的相关文章

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

数据结构和算法设计专题之---推断两个链表是否相交并找出交点

题目: 一个比較经典的问题,推断两个链表是否相交.假设相交找出他们的交点. 首先来看一下怎样推断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是採用hash来推断,将两个链表的节点进行hash.然后推断出节点,这样的想法当然是能够的. 2.当然採用暴力的方法也是能够的,遍历两个链表.在遍历的过程中进行比較,看节点是否同样. 3.第三种思路是比較奇特的,在编程之美上看到的. 先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null

数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点

题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的

单链表的算法设计

当学习完单链表后,仔细回忆回忆,单链表还是很容易掌握的,但是还是要仔细认真的品味. 单链表可以看做是由若干个结点由指针指向后继结点一种表.结点是由数据域和指针域构成.真正有效的存储是数据域,指针域负责指向下一个结点存储的位置,所以它的存储密度都是小于1,而之前学习的顺序表存储密度都是1.那么如何定义结构体 12345 typedef struct { Eletype data; struct *next;//指针域}node,*Node; 那么单链表具体可以做些什么操作哪? 初始化操作,主要是对

韩顺平_PHP程序员玩转算法公开课(第一季)02_单链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/链表——最灵活的数据结构链表用来解决复杂的问题和算法是很方便的. 内容介绍1.什么是链表2.单向链表3.双向链表4.环形链表5.使用环形链表解决约瑟夫问题 链表——什么是链表链表是有序的列表,但是它在内存中是分散存储的. 链表无处不在,比如在操作系统中,文件和文件之间,文件块和文件块之间,是靠链表链接起来的.使用链表可以解决类似约瑟夫问题,排序,索引,二叉树,广义表... 链表——单链表的快速入门使用head头的单向链表

数据结构与算法——线性表链式存储(单链表)

今天总结单链表的实现. 什么是链表? 就是采去链式存储结构的线性表,所谓链式存储就好比火车的车厢一样,一节一节的连接起来,成为一个线性表.这种方式采用动态存储分配方式,即程序在运行时根据实际需要申请内存空间,不需要时将内存空间释放掉. 链表用一组任意的存储单元存放线性表中的各个元素,这组存储单元可以是连续的,也可以是不连续的. 什么是单链表? 单链表简单理解就是单向的,就像火车一样.如果将火车头与火车为连接在一块,就构成了循环链表. 链表的结构:链表采用节点结构,这个节点分为两部分,一部分存储数

数据结构实验之链表五:单链表的拆分

数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. 输入 第一行输入整数N;: 第二行依次输入N个整数. 输出 第一行分别输出偶数链表与奇数链表的元素个数: 第二行依次输出偶数子链表的所有数据: 第三行依次输出奇数子链表的所有数据. 示例输入 10 1 3 22

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

静态单链表和动态单链表的区别

链表中结点的分配和回收是由系统提供的标准函数malloc和free动态实现的,称之为动态链表. 如果程序支持指针,则可按照我们的一般形式实现链表, 需要时分配,不需要时回收即可. 动态链表的空间是可以动态扩展的. typedef struct  node{ EleType data; struct node * pNext; }Node; 有些高级语言中没有"指针"数据类型,只能用数组来模拟线性链表的结构, 数组元素中的指针"域"存放的不是元素在内存中的真实地址,而

用链表实现表单金额的大写格式输出

1 include<iostream> 2 using namespace std; 3 #include<string> 4 5 typedef int T; 6 7 class List{ 8 struct Node{ 9 T data1; 10 string data2; 11 Node* next; 12 Node(const T& t=T(), string s=string()):data1(t),data2(s){next = NULL;} 13 }; 14