您的位置:首页 > 其它

[算法练习] 反转链表

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: