zoukankan      html  css  js  c++  java
  • Leetcode206.反转链表

    题目

    反转一个单链表。

    示例:

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL

    代码

    法一、迭代法

     1 class Solution {
     2 public:
     3     ListNode* reverseList(ListNode* head) {
     4         ListNode* pre = NULL; ListNode* cur = head;
     5         // pre 前指针,cur 当前指针, tmp 保存当前指针后一个
     6         while(cur != NULL  ){
     7             ListNode* tmp = cur->next;
     8             cur->next = pre;
     9             pre = cur;  //前指针后移
    10             cur = tmp;  //当前指针后移
    11     }
    12     return pre;
    13     }
    14 };

    这种方法开始画个图理解,比如举只有两个节点的链表,找到规律:修改当前指针指向前节点,前指针后移,当前指针后移。

    不断的循环此步骤,但是当前指针指向前面节点时,当前指针如何更新后移?所以还需要一个指针保存当前指针的下一个节点。

    时间复杂度 O(n),空间复杂度O(1)

    法二、递归(尾递归)。。.有些不好理解

     1 class Solution {
     2 public:
     3     ListNode* reverseList(ListNode* head) {
     4         if(head == NULL || head->next == NULL ) return head;
     5         ListNode*p =  reverseList(head->next);
     6         head->next->next = head;
     7         head->next = NULL;  //a1节点指向空
     8         return p;
     9     }
    10 };

    时间复杂度O(n),空间复杂度O(n)——隐式栈空间

     
  • 相关阅读:
    Schema和数据类型优化?
    语雀发布博客园
    为知笔记文章目录
    码云搭建博客
    springboot的过滤器、监听器、拦截器
    springboot常用注解
    springboot使用小技巧合集
    springboot整合swagger2
    强制卸载win软件
    xshell下载和优化配置
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/13288771.html
Copyright © 2011-2022 走看看