单向链表翻转

好久没写C代码了,看到微博上有人出了这个题。手痒写一下。指针这个东西,用得好妙笔生花,用得不好就会各种踩坑。

至于链表,主要是要考虑好它的结构。可以画图来帮助思考。然后就是注意一些变量的变化。

01 #include <string>
02 #include <cstring>
03 #include <iostream>
04 #include <cstdio>
05 using namespace std;
06 #define LL long long
07  
08 struct node{
09        int x;
10        node *next;
11 };
12 //输出
13 int printlist(node *ps){
14     while(ps!=NULL){
15        printf("%d %d %d\n",ps,ps->x,ps->next);
16        ps=ps->next;
17     }
18     return 0;
19 }
20 //翻转
21 node *overturn(node *start){
22          //开始反转
23     node *ps=start;
24     node *tmp=NULL;
25     node *last=NULL;
26     while(ps!=NULL){
27         //保存原链表中,这个节点指向的下一个节点。
28         tmp=ps->next;
29         //将当前节点指向上一个节点
30         ps->next=last;
31         last=ps;       
32         ps=tmp;
33     }
34     start=last;
35     return start;
36 }
37   
38 node *init(){
39     node *start=NULL;
40     node *last=NULL;
41     node *ps=start;
42     int x,num;
43     scanf("%d",&num);
44     for(int i=0;i<num;i++){
45         scanf("%d",&x);
46         node *ps=new node;
47                 
48         //链表赋值
49         ps->x=x;
50         ps->next=NULL;
51  
52         //让上一个指针向它
53         if(last==NULL){   
54             start=ps;
55         }else{
56             last->next=ps;
57         }
58         last=ps;
59     }
60     return start;
61 }
62  
63 int deletelist(node *ps){
64     node *tmp;
65     while(ps!=NULL){
66        tmp=ps;
67        ps=ps->next;
68        delete tmp;
69     }
70 }
71  
72 int main(void)
73 {
74     //数据输入
75     node * start=init();
76     //输出链
77     printlist(start);
78     //分割线
79     printf("\n");
80     //翻转
81     start= overturn(start);
82     //输出链
83     printlist(start);
84     //回收内存
85     deletelist(start);
86     start=NULL;
87     return 0;
88 }

 

转载请注明:旅途@KryptosX » 单向链表翻转

时间: 2024-10-02 19:10:58

单向链表翻转的相关文章

单向链表的翻转

单向链表翻转,之前把这个问题想的太简单了,以为只要把数据域翻转过来就可以了,结果是筐了大瓢,下面举一个简单的例子说明: 假设有n个人站成一排,现在要把这n个人的站的顺序颠倒过来,那么就不能只把这n个人的身高颠倒过来,而是要把每一个人的位置颠倒过来,第一个人站到最后,第二个人站倒数第二,以此类推. 为了检验程序的正确性,这一次我们打印时不能再打印结点数据,而要打印结点.Java程序运行时,JVM为程序开辟了内存空间,每一个结点在栈中都有一个保存的位置,要注意的是,每次程序运行时某一个结点在内存中保

c语言-反转单向链表,C语言,运行出错

问题描述 反转单向链表,C语言,运行出错 #include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct LNode{ int node; struct LNode *next; } LNode,*LinkList; LinkList Head_Node() { LinkList he

Java中单向链表的实现:增删查改功能

写一个大家都比较熟悉的数据结构:单向链表. 不过先告诉大家一个小秘密,java的API里面已经提供了单向链表的类,大家可以直接拿来用,不过学习数据结构课程的时候想必大家也已经知道,虽然系统会给我们提供一些常用的数据结构,但是自定义的总是能够带来不同的喜感的,而且通过自己的编写也更能够让我们了解其中实现的过程,而且我们还可以写一些比较个性化的方法作为属于自己的数据结构.这里主要是介绍一些常用结构里面都会用到的方法,以及链表具体是如何操作的. 首先,单链表相对于队列的优势在于存储地址不是连续的,这样

C语言实现一个简单的单向链表list

用C语言实现一个简单实用的单向链表list,具有一定的实际意义.尤其我们不想使用STL里面的list<...>类的时候.我实现的这个list,结点存储任何调用者分配的任意类型的数据(void*).这个list适用于一些简单的场合,消耗极少的资源. 头文件: /* * list.h * Generic sequential linked list node structure -- can hold any type data. * cheungmine * Sep. 22, 2007. All

单向链表的方法优化

前几天写了一篇关于单向链表的实现方法,单向链表的具体实现在里面都有说明,见博客:http://cq520.iteye.com/blog/1853186 不过细心的朋友也许发现了,上次写的几个方法其实是存在漏洞的,插入方法与删除方法都不能操作第一个元素,而实际上操作第一个元素的方法与操作其他元素的方法是一样的,只是代码描叙上有些差异,原因在于:首结点不存在前结点对它的引用 优化之后的代码如下: Java代码 /** * 向链表中插入新元素的方法 * @param index 插入的位置 * @pa

C#如何实现单向链表

链表是一种重要的数据结构,该结构由节点组成.每个节点包含两部分数据,第一部分是节点本身的数据,第二部分是指向下一个节点的指针.对于单向链表,链表中存在两个特殊的节点,分别为"头节点"和"尾节点".头节点本身没有数据,只存储下一个节点的指针,尾节点只存储数据.结点的定义及对线性表的操作如下: 首先,定义一个结点类用于对结点的描述.其中,私有成员Value用于储存节点本身的数据,Next用于存储下一个节点的指针,Previous用于存储上一个节点的指针.对于链表的操作,

如何使用递归和非递归方式反转单向链表

以下是对使用递归和非递归方式反转单向链表的示例进行了详细的分析介绍,需要的朋友可以过来参考下   问题: 给一个单向链表,把它从头到尾反转过来.比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a . 分析:假设每一个node的结构是: 复制代码 代码如下: class Node {  char value;  Node next; } 因 为在对链表进行反转的时候,需要更新每一个node的"next"值,但是,在更新

在C++数据结构中,关于单向链表的排序顺序控制,如何让单向链表按照逆序排列?

问题描述 在C++数据结构中,关于单向链表的排序顺序控制,如何让单向链表按照逆序排列? 在C++数据结构中,关于单向链表的排序顺序控制,如何让单向链表按照逆序排列? 解决方案 http://blog.163.com/lixiangqiu_9202/blog/static/53575037201187102524490/ if(p->next->data<q->next->data) -> if(p->next->data>q->next->

指针-寻找一个单向链表的中项,如果存在两个则返回前一个

问题描述 寻找一个单向链表的中项,如果存在两个则返回前一个 import javax.naming.spi.DirStateFactory.Result; public class LinkList { //头结点 Link first; //单链表构造函数 public LinkList(){ first = null; } //判断单链表是否为空 public boolean isEmpty(){ return (null==first); } //在单链表头插入新结点 public voi