题解 | #反转链表#

反转链表

http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

题目的主要信息:

  • 给定一个长度为nn的链表,反转该链表,输出表头
  • 要求:时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)

方法一:递归(能过,空间不符合要求)

具体做法:

我们可以利用递归的反向工作来实现逆转。对于每个结点我们递归向下遍历到最后,然后往上依次逆转两个结点,递归终止就是后面遇到了空结点。

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead == NULL || pHead->next == NULL)
            return pHead;
        ListNode* newHead = ReverseList(pHead->next); //反转下一个
        pHead->next->next = pHead; //逆转
        pHead->next = NULL; //设置空结点
        return newHead;
    }
};

复杂度分析:

  • 时间复杂度:O(n)O(n),相当于递归遍历链表
  • 空间复杂度:O(n)O(n),递归栈深度为链表长度nn

方法二:迭代

具体做法:

我们可以设置两个指针,一个当前结点的指针,一个上一个结点的指针,我们遍历链表的时候,断开当前结点与后面的结点,并用临时变量记录后一个结点,然后当前结点指向上一个结点,再轮换当前指针与上一个指针。 alt

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead == NULL)
            return NULL;
        ListNode* cur = pHead;
        ListNode* pre = NULL;
        while(cur != NULL){
            ListNode* temp = cur->next; //断开链表,要记录后续一个
            cur->next = pre; //当前的next指向前一个
            pre = cur; //前一个更新为当前
            cur = temp; //当前更新为刚刚记录的后一个
        }
        return pre;
    }
};

复杂度分析:

  • 时间复杂度:O(n)O(n),遍历链表一次
  • 空间复杂度:O(1)O(1),无额外空间使用
孤帆远影碧空尽 文章被收录于专栏

牛客网各类题单题解~

全部评论

相关推荐

太难了,双9bg也被刷
投递韶音科技等公司10个岗位
点赞 评论 收藏
分享
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
07-18 15:02
门头沟学院 Java
刚打开网申页面就不想填了,还是不要为难自己了
poppinzhan...:多益老行业毒瘤了,碰到徐波这种恶心的烂人,去了也是受罪。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务