剑指 24 反转链表
原题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
考查知识点
双指针法
自己的第一遍解法
第一眼看到链表问题就应该想到双指针法。
我们画一个例子出来
1->2->3->null
要想让链表顺序倒过来,就是修改各个节点的指向,修改1
的指向就是让它指向nullptr
,让2
指向1
就必须得记住2
的前一个节点,并且更改指向后还得记住未更改之前的下一个节点,这样才能正确遍历原来的链表。使用双指针法,快指针fast
指向当前要修改指向的节点,慢指针slow
要指向要修改指向节点的前一个节点,同时为了保证按照原本链表顺序继续更改指向,还需要用临时指针tmp
保存要修改指向的节点的原本指向的下一个节点。在上面的例子中,就是fast
指向2
,slow
指向1
,tmp
指向3
。代码如下:
struct ListNode
{
int val;
ListNode *next;
ListNode(int x): val(x), next(nullptr) {}
};
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (head == nullptr)
return nullptr;
ListNode *fast = head;
ListNode *slow = nullptr;
ListNode *tmp = nullptr; //用于保存未更改指向时fast指向节点的下一个节点
while (fast->next != nullptr)
{
tmp = fast->next;
//更改指向
fast->next = slow;
//快慢指针递进
slow = fast;
fast = tmp;
}
//包含单节点与多节点中的尾节点情况
fast->next = slow;
return fast;
}
};
注意对传入头结点的有效性判断,并且考虑链表只有一个节点的情况。