【剑指】24.反转链表

题目描述

  • 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

算法分析

  • 迭代法:从头结点开始修改,每次保存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;
}


猜你喜欢

转载自blog.csdn.net/ansizhong9191/article/details/80697328
今日推荐