博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单向链表反转
阅读量:6415 次
发布时间:2019-06-23

本文共 952 字,大约阅读时间需要 3 分钟。

题目:
已知单向链表的头结点head,写一个函数把这个链表逆序 ( Intel)



解答:

我们假设单向链表的节点如下:

None.giftemplate <typename T>
None.gif
class list_node
ExpandedBlockStart.gif {
InBlock.gif
public:
InBlock.giflist_node * next;
InBlock.gifT data;
ExpandedBlockEnd.gif};

这个题目算是考察数据结构的最基础的题目了,有两种方法可以解此题:


方法一:

None.gif    
void reverse(node*& head)
ExpandedBlockStart.gif     {
InBlock.gif        
if ( (head == 0) || (head->next == 0) ) 
return;
//
 边界检测
InBlock.gif
        node* pNext = 0;
InBlock.gif        node* pPrev = head;
//
 保存链表头节点
InBlock.gif
        node* pCur = head->next;
//
 获取当前节点
InBlock.gif
        
while (pCur != 0)
ExpandedSubBlockStart.gif        {
InBlock.gif            pNext = pCur->next;
//
 将下一个节点保存下来
InBlock.gif
            pCur->next = pPrev;
//
 将当前节点的下一节点置为前节点
InBlock.gif
            pPrev = pCur;
//
 将当前节点保存为前一节点
InBlock.gif
            pCur = pNext;
//
 将当前节点置为下一节点
ExpandedSubBlockEnd.gif
        }
ExpandedBlockEnd.gif    }

这是一般的方法,总之就是用了几个临时变量,然后遍历整个链表,将当前节点的下一节点置为前节点。



方法二:

None.gif    node* reverse( node* pNode, node*& head)
ExpandedBlockStart.gif     {
InBlock.gif        
if ( (pNode == 0) || (pNode->next == 0) ) 
//
 递归跳出条件
ExpandedSubBlockStart.gif
        {
InBlock.gif            head = pNode; 
//
 将链表切断,否则会形成回环
InBlock.gif
            
return pNode;
ExpandedSubBlockEnd.gif        }
InBlock.gif
InBlock.gif        node* temp = reserve(pNode->next, head);
//
 递归
InBlock.gif
        temp->next = pNode;
//
 将下一节点置为当前节点,既前置节点
InBlock.gif
        
return pNode;
//
 返回当前节点
ExpandedBlockEnd.gif
    }
这个方法是采用了递归算法,也就是在反转当前节点之前先反转其后继节点,说白了其实就是利用函数的调用堆栈构建了一个临时链表罢了,挺废的一个算法,权当作是写着好玩,没有什么实在的意义。

采用此算法需要注意的是,头结点必须要传入的是引用,因为在递归跳出的时候要切断链表,否则链表将会形成一个回环。

转载地址:http://aocra.baihongyu.com/

你可能感兴趣的文章
Systemd入门教程:命令篇(转)
查看>>
java随机范围内的日期
查看>>
spring事务学习(转账案例)(二)
查看>>
[官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
查看>>
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>
Disruptor-NET和内存栅栏
查看>>
Windows平台ipod touch/iphone等共享笔记本无线上网设置大全
查看>>
播放加密DVD
查看>>
产品设计体会(3013)项目的“敏捷沟通”实践
查看>>