[算法练习] 反转链表
2015-10-10 15:35
447 查看
题目说明:
输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
程序代码:
#include <gtest/gtest.h> #include <vector> using namespace std; struct ListNode { int m_nKey; ListNode* m_pNext; }; ListNode* ReverseLinkedList(ListNode* pHead) { ListNode* pNext = pHead; ListNode* pPrev = NULL; while (pNext) { ListNode* pTemp = pNext->m_pNext; pNext->m_pNext = pPrev; pPrev = pNext; pNext = pTemp; } return pPrev; } // 递归方式实现 ListNode* ReverseLinkedList2(ListNode* pHead, ListNode* pPrev = NULL) { ListNode* pReversedHead = pHead; if (pHead) { if (pHead->m_pNext) { pReversedHead = ReverseLinkedList2(pHead->m_pNext, pHead); } pHead->m_pNext = pPrev; } return pReversedHead; } ListNode* CreateLinkedList(const string& data) { ListNode* pHead = NULL; ListNode* pLast = NULL; for (int i=0; i<data.size(); ++i) { ListNode* pNext = new ListNode(); pNext->m_nKey = data[i]; pNext->m_pNext = NULL; if (!pHead) { pHead = pLast = pNext; } else { pLast->m_pNext = pNext; pLast = pNext; } } return pHead; } void ReleaseLinkedList(ListNode* pHead) { ListNode* pTemp = NULL; while (pHead) { pTemp = pHead; pHead = pHead->m_pNext; delete pTemp; } } string ConvertLinkedList(ListNode* pHead) { string strValue; while (pHead) { strValue+= (char)pHead->m_nKey; pHead = pHead->m_pNext; } return strValue; } TEST(Pratices, tReverseLinkedList) { // NULL ListNode* pHead = NULL; pHead = ReverseLinkedList(pHead); ASSERT_TRUE(!pHead); // a -> a pHead = CreateLinkedList("a"); pHead = ReverseLinkedList(pHead); ASSERT_EQ(ConvertLinkedList(pHead),"a"); ReleaseLinkedList(pHead); // ab -> ba pHead = CreateLinkedList("ab"); pHead = ReverseLinkedList(pHead); ASSERT_EQ(ConvertLinkedList(pHead),"ba"); ReleaseLinkedList(pHead); // abcedfg -> gfdecba pHead = CreateLinkedList("abcedfg"); pHead = ReverseLinkedList(pHead); ASSERT_EQ(ConvertLinkedList(pHead),"gfdecba"); ReleaseLinkedList(pHead); /// 递归逆序测试 pHead = NULL; pHead = ReverseLinkedList2(pHead); ASSERT_TRUE(!pHead); // a -> a pHead = CreateLinkedList("a"); pHead = ReverseLinkedList2(pHead); ASSERT_EQ(ConvertLinkedList(pHead),"a"); ReleaseLinkedList(pHead); // ab -> ba pHead = CreateLinkedList("ab"); pHead = ReverseLinkedList2(pHead); ASSERT_EQ(ConvertLinkedList(pHead),"ba"); ReleaseLinkedList(pHead); // abcedfg -> gfdecba pHead = CreateLinkedList("abcedfg"); pHead = ReverseLinkedList2(pHead); ASSERT_EQ(ConvertLinkedList(pHead),"gfdecba"); ReleaseLinkedList(pHead); }
相关文章推荐
- 【OpenCV入门指南】第一篇 安装OpenCV
- 布局Panel TGridPanel TFlowPanel
- hdu5289 Assignment
- 电脑怎么安装安卓(Android)x86 不使用U盘安装Android x86 4.4详细教程
- 数据结构--栈的构造、插入、删除、得到栈顶元素操作
- ztree系列之:如何动态更新节点数据(名称、图标、字体、颜色等)
- ios开发之IBOutlet和IBAction的区别
- 当代与古代
- [微信]微信网页授权用户基本信息接口文档
- bootstrap modal垂直居中
- GSM蜂窝基站定位基本原理浅析
- 堆和栈的总结
- gdiplus图像库的使用
- AFNetworking2.0源码解析<二>
- android ndk MIPS Support
- Java和C++类成员初始化的区别
- volley字符串乱码问题
- LBS基站定位和GPS卫星定位对比
- JAVA中文乱码简单解决办法
- 开关电源芯片选型