C++ 单向链表反转
单向链表反转,一道常见的面试题,动手实现下。
- #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++ 单向链表反转的更多相关文章
- php 单向链表反转 reverse (没有空的头结点)
* 参照php标准库设计接口 http://php.net/manual/en/class.spldoublylinkedlist.php * 反转单向链表 reverse方法, 其他的方法为了方便测 ...
- Java实现单向链表反转
public class LinkedListTest { public static void main(String[] args) { Node A = new Node("A&quo ...
- 数据结构——Java实现单向链表
结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...
- 输入一个单向链表,输出该链表中倒数第K个结点
输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...
- C语言基础 - 实现单向链表
回归C基础 实现一个单向链表,并有逆序功能 (大学数据结构经常是这么入门的) //定义单链表结构体 typedef struct Node{ int value; struct Node *next; ...
- Java实现单向链表基本功能
一.前言 最近在回顾数据结构与算法,有部分的算法题用到了栈的思想,说起栈又不得不说链表了.数组和链表都是线性存储结构的基础,栈和队列都是线性存储结构的应用- 本文主要讲解单链表的基础知识点,做一个简单 ...
- 复习下C 链表操作(单向链表)
Object-C 作为C 的包装语言(运行时.消息机制).如果不熟悉C 的话实在玩得太肤浅. 随便深入oc 内部都会接触到C. runtime .GCD.Block.消息机制... 所有强大的功能无不 ...
- 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等
参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...
- java 单链表反转
最近与人瞎聊,聊到各大厂的面试题,其中有一个就是用java实现单链表反转.闲来无事,决定就这个问题进行一番尝试. 1.准备链表 准备一个由DataNode组成的单向链表,DataNode如下: pub ...
随机推荐
- banana pro 板子
http://www.lemaker.org/cn/article-23-1.html
- libvirt之virt-install
在使用kvm命令建立虚拟机时每次都要输入很长的命令,容易出现输入错误,可以使用libvirt管理虚拟机,libvirt支持kvm,xen等主流虚拟机的管理,下面介绍一下利用libvirt管理虚拟机. ...
- Aggregating tests in suites
我们可以将来自不同类的test组成一个test suite.在JUnit 3.8.x我们使用 static Test suite()方法,但是在JUnit4我们使用在类前面加上注释 @RunWith( ...
- js用for循环为对象添加事件并传递参数
var objArr = getObjArr(id); for(var i=0; i<objArr.length; i++){ var param=objArr.param ad ...
- 设计模式19---设计模式之状态模式(State)(行为型)
1.场景模拟 考虑一个在线投票的应用,分为四种情况 正常投票 正常投票以后还继续重复投票 用户恶意投票 黑名单用户 2.不用模式的解决方案 package demo17.state.example1; ...
- Android 基础组件
基础组件 所有的控件都可以在java代码中创建出来,并且大部分的属性都对应set和get方法,比如 View view = new View(Context context) context是上下文 ...
- hdu3724Encoded Barcodes(Trie tree)
题目请戳这里 题目大意:给n个字符串,给m个询问,每个询问给k个条形码.每个条形码由8个小码组成,每个小码有相应的宽度,已知一个条形码的宽度只有2种,宽的表示1,窄的表示0.并且宽的宽度是窄的宽度的2 ...
- C#之Linq学习笔记【转】
写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...
- Java HttpClient
public class WebClient { public static final String POST_TYPE_JSON = "json"; public static ...
- WCF 接收我服务的 HTTP 响应时发生错误
错误内容: System.ServiceModel.CommunicationException: 接收对 https://xx.com/xx.svc的 HTTP 响应时发生错误.这可能是由于服务终结 ...