题目描述
- 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
算法分析
- 迭代法:从头结点开始修改,每次保存next节点,在下一次迭代中翻转;
- 递归法:从尾结点开始修改,pHead->next->next = pHead; pHead->next = nullptr;从后往前翻转;
提交代码:
class Solution {
public:
/* 迭代方法 */
ListNode* ReverseList2(ListNode* pHead) {
if (!pHead)
return nullptr;
ListNode* preNode = nullptr;
ListNode* currNode = pHead;
while (currNode)
{
ListNode* tempNode = currNode->next;
currNode->next = preNode;
preNode = currNode;
currNode = tempNode;
}
pHead = preNode;
return pHead;
}
/* 递归方法 */
ListNode* ReverseList(ListNode* pHead) {
if (!pHead || !pHead->next)
return pHead;
ListNode* ReverseHead = ReverseList(pHead->next);
pHead->next->next = pHead;
pHead->next = nullptr;
return ReverseHead;
}
};
测试代码:
// ====================测试代码====================
ListNode* Test(ListNode* pHead)
{
printf("The original list is: \n");
PrintList(pHead);
Solution s;
ListNode* pReversedHead = s.ReverseList(pHead);
printf("The reversed list is: \n");
PrintList(pReversedHead);
return pReversedHead;
}
// 输入的链表有多个结点
void Test1()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);
ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5);
ListNode* pReversedHead = Test(pNode1);
DestroyList(pReversedHead);
}
// 输入的链表只有一个结点
void Test2()
{
ListNode* pNode1 = CreateListNode(1);
ListNode* pReversedHead = Test(pNode1);
DestroyList(pReversedHead);
}
// 输入空链表
void Test3()
{
Test(nullptr);
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
return 0;
}