给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-linked-list
#include<iostream>
using namespace std;
/*思路:扫描链表,用一个新的结点依次头插法插入元素,时间复杂度O(n),空间复杂度O(1)*/
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr)
{
return nullptr;
}
if (head->next == nullptr)
{
return head;
}
ListNode* newHeadNode = new ListNode;
ListNode* Pointer = head->next;
while (Pointer != nullptr)
{
head->next = newHeadNode->next;
newHeadNode->next = head;
head = Pointer;
Pointer = Pointer->next;
}
head->next = newHeadNode->next;
newHeadNode->next = head;
return (newHeadNode->next);
}
};
void tailInsert(ListNode* headNode, int n)
{
ListNode* tailPointer = headNode;
for (int i = 0; i < n; i++)
{
ListNode* L = new ListNode;
cin >> L->val;
tailPointer->next = L;
tailPointer = L;
}
}
int main()
{
int n;
cin >> n;
ListNode* headNode = new ListNode;
tailInsert(headNode, n);
Solution s1;
headNode = s1.reverseList(headNode->next);
for (int i = 0; i < n; i++)
{
cout << headNode->val << endl;
headNode = headNode->next;
}
}