
面试首选解法:迭代法:O(n)时间 O(1)空间
核心思想:三个指针接力反转。
三个指针 分别记录三个位置:
prev:前一个节点 初始为NULL
curr:当前正在处理的节点,初始为链表的头结点head
next:下一个节点。临时保存当前节点的下一个节点
固定4步骤:
对于当下的每一个curr,按照4步走:
1.先存下一个节点
2.反转当前节点的指针
3.prev往前走一步
4.curr往前走一步
链表:1 → 2 → 3 → null
第一轮:处理 1
- next = 2
- 1 → null (反转指针)
- prev = 1
- curr = 2
现在样子:null ← 1 2 → 3 → null
第二轮:处理 2
- next = 3
- 2 → 1 (反转)
- prev = 2
- curr = 3
现在样子:null ← 1 ← 2 3 → null
第三轮:处理 3
- next = null
- 3 → 2 (反转)
- prev = 3
- curr = null
结束!
最后返回 prev → 3就是反转后的头节点!
cpp/** * Definition for singly-linked list. * 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) { ListNode* prev = nullptr;//prev首先为空 ListNode* curr = head; while(curr){ ListNode* next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; } };