剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。(来源LeetCode)
思路:迭代-双指针
复杂度分析:
时间复杂度 O(N): 遍历链表使用线性大小时间。
空间复杂度 O(1) : 变量 pre 和 cur 使用常数大小额外空间。
首先令pre指向空节点,cur指向头节点。然后temp保存后继节点cur->next;为了能反向输出需要 修改引用指向,即cur->next = pre ;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *cur = head ,*pre = nullptr;//cur指向头结点,pre指向最后的空
while(cur!=nullptr)
{
ListNode* tmp = cur->next; // 暂存后继节点 cur.next
cur->next = pre; // 修改 next 引用指向
pre = cur; // pre 暂存 cur
cur = tmp; // cur 访问下一节点
}
return pre;
}
};