206.翻转链表

256 阅读1分钟

Day25 2023/02/01

题目链接

难度:简单

题目

给定一个单链表的头节点pHead(该头节点是有值的,不如在下图,他的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:0 <= n <=1000
要求:空间复杂度O(1)O(1),时间复杂度:O(n)O(n)

示例

rev1ex1.jpg

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

思路一


采用双指针法,分别定义两个指针pre和cur,其中pre指向cur的前驱节点,然后遍历链表依次让cur->next指向pre,即可完成翻转。 如图所示:

206.翻转链表.gif

关键点


  • 每次反转的时候由于cur->next会指向pre从而导致丢失cur的下一个节点,所以循环一开始就要先暂存一下cur->next;

算法实现


c++代码实现-双指针法

Class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* tmp;
        ListNode* cur = head;
        ListNode* pre = nullptr;
        while (cur) {
            tmp = cur->next; //暂存cur的下一个节点
            cur->next = pre; //翻转相邻的两个节点
            
            //更新pre和cur指针
            pre = cur;
            cur = tmp;
        }
        return pre; //返回反转后的头节点
    }
};
  • 时间复杂度 O(n)O(n) --- 遍历一遍链表,其中n为链表长度
  • 空间复杂度 O(1)O(1) --- 没有额外的辅助空间

总结

  • 双指针法是从前往后翻转,在不考虑空间复杂度的情况下,可以用递归的方式从后往前翻转。