算法-单向链表逆序
2012-09-19 13:14
218 查看
我们假设单向链表的节点如下:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
template<typename T>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class list_node
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
list_node* next;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
T data;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
};
void reverse(node*& head)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if ( (head==
0)|| (head->next==0)
)return;// 边界检测
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
node* pNext=0;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
node* pPrev=
head;// 保存链表头节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
node* pCur=
head->next;// 获取当前节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
while (pCur!=
0)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pNext= pCur->next;//
将下一个节点保存下来
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pCur->next=
pPrev;// 将当前节点的下一节点置为前节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pPrev= pCur;//
将当前节点保存为前一节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pCur= pNext;//
将当前节点置为下一节点
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
这是一般的方法,总之就是用了几个临时变量,然后遍历整个链表,将当前节点的下一节点置为前节点。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
template<typename T>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class list_node
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public:
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
list_node* next;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
T data;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
};
void reverse(node*& head)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
if ( (head==
0)|| (head->next==0)
)return;// 边界检测
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
node* pNext=0;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
node* pPrev=
head;// 保存链表头节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
node* pCur=
head->next;// 获取当前节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
while (pCur!=
0)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pNext= pCur->next;//
将下一个节点保存下来
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pCur->next=
pPrev;// 将当前节点的下一节点置为前节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pPrev= pCur;//
将当前节点保存为前一节点
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
pCur= pNext;//
将当前节点置为下一节点
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
这是一般的方法,总之就是用了几个临时变量,然后遍历整个链表,将当前节点的下一节点置为前节点。
相关文章推荐
- 线性单向链表的逆序排列算法一例
- 算法题18 逆序(字符串、整数、单向链表)
- alg : 单向链表逆序 on drv
- [算法练习]找到单向链表的中间节点
- [数据结构算法学习] 单向链表
- 判断一个单向链表是否有环,算法证明
- 不带头节点的单向链表逆序
- 单向链表每k个数逆序拼接
- 单向链表逆序
- 最简洁的单向链表逆序
- 算法之链表逆序排列
- 将一个单向链表逆序
- 链表相关算法小结(判断环、复制、逆序等)
- 单向链表逆序
- 单向链表的基本操作及逆序实现
- Java数据结构和算法——数组、单向链表、双向链表
- 《C算法》读书笔记(5):单向链表逆序
- ZT C语言链表操作(新增单向链表的逆序建立)
- 【数据结构&算法】数据结构之单向链表(练习)
- 一步一步写算法(之单向链表)