LeetCode算法 —— 反转链表(递归 + 迭代)

题目:
反转一个单链表。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。

递归的版本是看别人写的,只会写迭代,(>_<)


代码如下所示:

#include <iostream>

using namespace std;

struct ListNode {
	int val;
	ListNode* next;
	ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
	// 递归求解
	ListNode* reverseList(ListNode* head) {
		if (head == nullptr || head->next == nullptr)
			return head;

		ListNode* p = reverseList(head->next);
		head->next->next = head;
		head->next = nullptr;

		return p;
	}

	//迭代求解
	//ListNode* reverseList(ListNode* head) {
	//	if (head == nullptr || head->next == nullptr)
	//		return head;

	//	ListNode* pre = new ListNode(0);
	//	pre->next = head;
	//	ListNode* tmp = head;

	//	while (tmp != nullptr && tmp->next != nullptr) {
	//		ListNode* start = tmp->next;		// 当前需要操作的结点 
	//		pre->next = start;
	//		tmp->next = start->next;
	//		start->next = head;
	//		head = start;
	//	}

	//	return pre->next;
	//}

};

int main() {

	ListNode* p = new ListNode(1);
	p->next = new ListNode(2);
	p->next->next = new ListNode(3);
	p->next->next->next = new ListNode(4);
	p->next->next->next->next = new ListNode(5);


	ListNode* tmp = (new Solution())->reverseList(p);

	while (tmp) {
		cout << tmp->val << endl;
		tmp = tmp->next;
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42100963/article/details/107491707