单向链表反转,一道常见的面试题,动手实现下。

 #include "stdafx.h"
#include <stdlib.h>
struct Node{
int data;
Node* next;
}; void print1(Node *head)
{
Node *p;
p=head;
if(head!= NULL)
do
{
printf("%d \n", p->data);
p=p->next;
}while(p!=NULL);
} Node* ReverseList(Node* head)
{
if(head==NULL)
return NULL; Node* cur=head;
Node* pre=NULL;
Node* nx=NULL;
while(cur->next!=NULL)
{
nx=cur->next;
cur->next=pre;
pre=cur;
cur=nx;
}
cur->next=pre;
return cur;
}
Node* init( int num) // insert from back
{
if( >= num)
return NULL;
Node* cur, pre;
Node* head = NULL;
int i = ; cur = head;
Node* new1 = (Node*)malloc(sizeof(Node));
new1->data = ;
head = cur = new1;
for(i = ; i < num; i++)
{
Node* new1=(Node*)malloc(sizeof(Node));
new1->data = i + ;
cur->next = new1;
cur = new1;
}
cur->next = NULL;
return head;
}
int _tmain(int argc, _TCHAR* argv[])
{
Node* list =NULL;
list=init();
print1(list);
Node* newlist=ReverseList(list);
print1(newlist);
getchar();
return ;
}

原理就是把cur节点的next节点保存,把next指向pre节点,把之前保存的next节点赋给cur,不断循环直到next节点为NULL。注意下,退出循环后要把cur节点next指向pre节点。把cur节点返回,大功告成。

如果不用返回值,而是把head=cur;这样可以吗?

可尝试下,那么你会看到打印结果为1。这是因为函数按指针传递,传递的是地址,虽然在reverse函数中head已是一个反转的链表,但在main函数中list仍然指向原来head的地址。换句话说,在反转链表整个过程中地址是不变的,list还是指向data 1的节点。

C++ 单向链表反转的更多相关文章

  1. php 单向链表反转 reverse (没有空的头结点)

    * 参照php标准库设计接口 http://php.net/manual/en/class.spldoublylinkedlist.php * 反转单向链表 reverse方法, 其他的方法为了方便测 ...

  2. Java实现单向链表反转

    public class LinkedListTest { public static void main(String[] args) { Node A = new Node("A&quo ...

  3. 数据结构——Java实现单向链表

    结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...

  4. 输入一个单向链表,输出该链表中倒数第K个结点

    输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...

  5. C语言基础 - 实现单向链表

    回归C基础 实现一个单向链表,并有逆序功能 (大学数据结构经常是这么入门的) //定义单链表结构体 typedef struct Node{ int value; struct Node *next; ...

  6. Java实现单向链表基本功能

    一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...

  7. 复习下C 链表操作(单向链表)

    Object-C 作为C 的包装语言(运行时.消息机制).如果不熟悉C 的话实在玩得太肤浅. 随便深入oc 内部都会接触到C. runtime .GCD.Block.消息机制... 所有强大的功能无不 ...

  8. 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等

    参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...

  9. java 单链表反转

    最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...

随机推荐

  1. 项目管理模式之如何去除SVN标记

    原问地址:http://blog.csdn.net/djcken/article/details/7916986      当项目不需要SVN标志的时候,我们一般怎么办哪??可能很多人设置Window ...

  2. 转自http://blog.sina.com.cn/daylive——C++ STL map

    Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1.map最基本的构造函数: map<string ...

  3. 如何计算Java对象占用了多少空间?

    在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小. 对象头 对象的头部至少有两个WORD, ...

  4. G - Balanced Lineup - poj3264(区间查询)

    题意:给你一组值,然后询问某个区间的最大值和最小值得差 分析:因为没有更新,所以只需要查找即可,节点保存一个最大值最小值就行了 ************************************ ...

  5. Oracle 数据库基本操作——表操作:查询

    目录: 1.基本查询 2.多表查询 3.多行查询 4.集合查询 2.连接 3.嵌套查询 1.基本查询 语法: select column|others{,columnName|others} from ...

  6. (转)Maven实战(三)Eclipse构建Maven项目

    1. 安装m2eclipse插件    要用Eclipse构建Maven项目,我们需要先安装meeclipse插件    点击eclipse菜单栏Help->Eclipse Marketplac ...

  7. ASP.NET MVC3调用分部视图-PartialView的几种方式(集)

    我们的网页通常会有好几个部分组成,一些公共的区域我们通常会做成PartialView(部分视图),但这些视图并不是完全固定的,所以还是需要 特定的Controller来控制.如果只是静态的html,虽 ...

  8. Linux命令之查找

    在Linux中,有非常多方法能够做到这一点.国外站点LinuxHaxor总结了五条命令,你能够看看自己知道几条.大多数程序猿,可能常常使用当中的2到3条,对这5条命令都非常熟悉的人应该是不多的. 1. ...

  9. int? 类型数据

    在数据库操作中,会遇到在int的单元格恰好为NULL值的情况,这个时候我们可以直接判断是否为null然后进行赋值,有人就想那我刚好用一下:?表达式不就好了: ) ? ); 这时候编译器会报错,原因就是 ...

  10. 网页JavaScript3

    window.document 1,确认元素, document.getElementById("id");           根据id找元素 doucment.getEleme ...