思路
双指针法,就地翻转
- 创建left和right指针,指向待翻转的两元素;
循环(直到right指针指向为nullptr):
2. left->next和right->next指向更新;
3. head和right指向后移;(每次迭代都是head和right指针指向更新,right指针指向不变)
复杂度
时间:O(N)
空间:O(1)
代码(C++)
struct ListNode
{
ListNode* next = 0;
int val = 0;
ListNode(int v, ListNode* n = nullptr):val(v), next(n){};
}
ListNode* reverseListNode(ListNode* head)
{
// 判断head和head->next指向为空,则直接返回
if(head == nullptr || head->next == nullptr)
{
return head;
}
// 创建left和right指针
ListNode* left = head;
ListNode* right = head->next;
// right指针非空
// left指针指向地址不变动,变动头指针和right指针指向地址
while(right != nullptr)
{
left->next = right->next;
// 翻转,right指针指向链表头
right->next = head;
// 链表头后移
head = right;
// right指针后移
right = left->next;
}
return head;
}