c 单链表反转(不添加新结点空间)
最近复习考研,加上一直都将"算法"放在很高的位置,所以,蛮重视算法的.不多说了,其实这个问题,不难理解的.
主要代码:
//反转单链表.
void
reverse(linklist lList) {
Linknode *pre = NULL; //注意该结点不能再指向别的非空结点.
Linknode *cur = lList->next;
Linknode *next;
while(cur) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
lList->next = pre;
}
我最近发现,算法这东西,光靠空想是很痛苦,很难理解的,我建议各位不懂的时候,多用笔,在纸上画图,对于数字型,同样是有效的.
完整代码:
#include <stdio.h>
#include <malloc.h> #define FALSE 0
#define TRUE 1 typedef struct node {
int data;
struct node *next;
} Linknode; typedef Linknode *linklist; linklist
init(int); void
traverse(linklist); void
reverse(linklist); int
main(void) {
int n = ;
linklist lList = init(n);
traverse(lList);
reverse(lList);
traverse(lList);
} //根据指定结点的个数,初始化一个带有头结点的单链表.
linklist
init(int n) {
linklist lList = (linklist)malloc(sizeof(struct node)); //头结点.
lList->next = NULL; //初始时链表为空.
lList->data = n; //头结点存储总元素个数.
if(!lList) {
printf("out of memory!\n");
return FALSE;
}
int i;
Linknode * tail = lList;
for(i = ; i < n; i++) {
Linknode * nNew = (Linknode *)malloc(sizeof(struct node));
if(!nNew) {
printf("out of memory!\n");
return FALSE;
}
nNew->data = i + ; //为新结点赋值.
//重新指定尾结点.
tail->next = nNew;
tail = nNew;
nNew->next = NULL;
}
return lList;
} //遍历单链表所有结点.
void
traverse(linklist lList) {
Linknode * node;
node = lList->next; //开始时指向第一个结点.
while(node) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
return;
} //反转单链表.
void
reverse(linklist lList) {
Linknode *pre = NULL; //注意该结点不能再指向别的非空结点.
Linknode *cur = lList->next;
Linknode *next;
while(cur) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
lList->next = pre;
}
我网上搜了一下,有蛮多人写的,我这里就写一种方法就行了,至于开辟新节点空间的方式,我觉得是小儿科的.
c 单链表反转(不添加新结点空间)的更多相关文章
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- java单链表反转
今天做leetcode,遇到了单链表反转.研究了半天还搞的不是太懂,先做个笔记吧 参考:http://blog.csdn.net/guyuealian/article/details/51119499 ...
- Java单链表反转图文详解
Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...
- Python实现单链表数据的添加、删除、插入操作
Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...
- 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等
参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...
- 求单链表倒数第m个结点
问题:求单链表倒数第m个结点,要求不准求链表的长度,也不许对链表进行逆转 解:设置两个指针p和q,p.q指向第一个结点.让p先移动到链表的第m个结点,然后p和q同时向后移动,直到p首先到达尾结点.此时 ...
- 单链表反转(Singly Linked Lists in Java)
单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法 package dsa.linkedlist; public class Node<E> ...
- java实现单链表反转(倒置)
据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. 1 public class Node { 2 int index; ...
- 单链表反转java代码
据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. public class Node { int index; Nod ...
随机推荐
- php防止SQL注入详解及防范
SQL 注入是PHP应用中最常见的漏洞之一.事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义( ...
- Python新手学习基础之数据结构-列表1
创建一个列表 讲完了序列,我们现在来讲讲Python中最常见的一种序列数据类型--列表. 列表创建的语法是: list_name = [item1, item2, item3, .......] 列表 ...
- MVC中的过滤器
authour: chenboyi updatetime: 2015-05-09 09:30:30 friendly link: 目录: 1,思维导图 2,过滤器种类(图示) 3,全局过滤器 ...
- JQ之路——layer第三方弹窗
layer官网 <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script&g ...
- mysql的mvcc(多版本并发控制)
mysql的mvcc(多版本并发控制) 我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能. 什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列 ...
- 【Hybrid App】关于Hybrid App技术解决方案的选择
[引言]近年来随着移动设备类型的变多,操作系统的变多,用户需求的增加,对于每个项目启动前,大家都会考虑到的成本,团队成员,技术成熟度,时间,项目需求等一堆的因素.因此,开发App的方案已经变得越来越多 ...
- How Many Points of Intersection?
uva10790:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_prob ...
- Jest
http://www.ibm.com/developerworks/cn/java/j-javadev2-24/
- Android调用 Webservice报org.ksoap2.serialization.SoapPrimitive(转)
android Webservice开发的时候一般情况下大家接受webservice服务器返回值的时候都是使用SoapObject soapObject = (SoapObject) envelope ...
- Quantization Method
如上一篇Quantization所说,可以在编码端通过设置offset来调整量化后的值,从而趋向于期望的量化值,而且在逆量化公式可以看出offset值在逆量化的时候是不会用到的. 目前来说,确定off ...