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)——隐式栈空间

     
  • 相关阅读:
    多态
    封装,继承,多态
    基本类型和引用类型的区别
    第七天 面向对象
    什么是Java线程池
    游戏内核架构
    放松
    静不下来心写代码
    速度和正确率
    理顺思路
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/13288771.html
Copyright © 2011-2022 走看看