题目

反转一个单链表。

示例:

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

进阶:

你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

注意:本题同【剑指Offer】面试题24. 反转链表

思路一:反转链表元素

取出链表中元素放入vector中,然后将vector中元素逆向存入链表中。

  1. 遍历链表,用vector存放数组元素。
  2. 再次遍历链表,从vector尾部读取元素依次放入链表中。

代码

时间复杂度:O(n)

空间复杂度:O(n)

ListNode* reverseList(ListNode* head) {
if (head == nullptr) {
return head;
}
vector<int> res;
ListNode *pNode = head;
while (pNode != nullptr) {
res.push_back(pNode->val);
pNode = pNode->next;
}
vector<int>::reverse_iterator iter = res.rbegin();
pNode = head;
while (pNode != nullptr) {
pNode->val = *iter;
iter++;
pNode = pNode->next;
}
return head;
}

思路二:迭代

需要调整当前元素指针指向前一个元素,必须先存储其前一个元素,另外为了继续遍历链表,在改动指针前,还需要存储下一个节点。新头结点为最后保存的前一个元素。

代码

时间复杂度:O(n)

空间复杂度:O(1)

ListNode* reverseList(ListNode* head) {
if (head == nullptr) {
return head;
}
ListNode *cur = head;
ListNode *pre = nullptr;
while (cur != nullptr) {
ListNode *next = cur->next;//保存当前节点下一个节点
cur->next = pre;//反转指针
pre = cur;//分别移动pre和cur
cur = next;
}
return pre;
}

思路三:递归

通过递归反转链表后面的元素,递归终止条件为当前节点为空或下一个节点为空。现在对头节点进行反转,假设链表此时为:

head -> n1 <- n2... <-n

对头结点进行反转:head->next->next = head;

然后将头节点next设为nullptr。

代码

时间复杂度:O(n)

空间复杂度:O(n),由于使用递归,会使用隐式栈空间,递归深度可能达到n层。

ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode *p = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return p;
}

【LeetCode】206. 反转链表的更多相关文章

  1. LeetCode 206. 反转链表(Reverse Linked List) 16

    206. 反转链表 206. Reverse Linked List 题目描述 反转一个单链表. 每日一算法2019/5/19Day 16LeetCode206. Reverse Linked Lis ...

  2. 每天一道面试题LeetCode 206 -- 反转链表

    LeetCode206 反转链表 思路 代码 # # @lc app=leetcode.cn id=206 lang=python3 # # [206] 反转链表 # # https://leetco ...

  3. leetCode:206 反转链表

    206. 反转链表 题目:反转一个单链表. 进阶:链表可以迭代或递归地反转.你能否两个都实现一遍? 非递归代码: class Solution { public ListNode reverseLis ...

  4. Java实现 LeetCode 206 反转链表

    206. 反转链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL ...

  5. leetcode 206. 反转链表 及 92. 反转链表 II

    206. 反转链表 问题描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-> ...

  6. LeetCode 206.反转链表(Python3)

    题目: 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶:你可 ...

  7. LeetCode 206——反转链表

    对单链表进行反转有迭代法和递归法两种. 1. 迭代法 迭代法从前往后遍历链表,定义三个指针分别指向相邻的三个结点,反转前两个结点,即让第二个结点指向第一个结点.然后依次往后移动指针,直到第二个结点为空 ...

  8. leetcode 206 反转链表 Reverse Linked List

    C++解法一:迭代法,使用前驱指针pre,当前指针cur,临时后继指针nxt: /** * Definition for singly-linked list. * struct ListNode { ...

  9. Leetcode春季打卡活动 第二题:206. 反转链表

    Leetcode春季打卡活动 第二题:206. 反转链表 206. 反转链表 Talk is cheap . Show me the code . /** * Definition for singl ...

  10. LeetCode 92. 反转链表 II(Reverse Linked List II)

    92. 反转链表 II 92. Reverse Linked List II 题目描述 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. LeetC ...

随机推荐

  1. Spring注解@ConfigurationPropertie

    @ConfigurationPropertie作用 参考的博客 springboot中@ConfigurationProperties注解的工作原理 @ConfigurationProperties是 ...

  2. Hystrix熔断机制导致误报请求超时错误

    问题的过程如下: (1)前端向服务端请求往HBase插入1000条数据: (2)请求经路由网关Zuul传递给HBaseService,HBaseService执行插入操作: (3)插入操作需要的时间超 ...

  3. 伪类:after,:before的用法

    :after和:before是css3中的伪类元素.用法是像元素的前或者后插入元素.以after为例: li:after{ content: ''; color: #ff0000; } 意思是向li元 ...

  4. IOS TableView 用法

    1.在视图上创建TableView( 拖控件),为ViewController创建UITableView属性(链接至TableView)和NSArray属性(存储数据) ViewController. ...

  5. SPFA和堆优化的Dijk

    朴素dijkstra时间复杂度$O(n^{2})$,通过使用堆来优化松弛过程可以使时间复杂度降到O((m+n)logn):dijkstra不能用于有负权边的情况,此时应使用SPFA,两者写法相似. 朴 ...

  6. P1072 开学寄语

    P1072 开学寄语 转跳点:

  7. Phoenix与HBase集成进行数据分析

    安装好Phoenix后配置环境变量 export PHOENIX_PATH=/opt/cloudera/parcels/APACHE_PHOENIX-4.14.0-cdh5.14.2.p0.3expo ...

  8. Docker 学习之镜像导入导出及推送阿里云服务器(三)

    在前面两节里主要就是记录一些docker的基本的操作,包括搜索镜像,拉取镜像,根据镜像创建容器等等,在这一节主要就是记录Docker对于镜像文件的导入导出,及推送到阿里云再从阿里云获取镜像. 一.镜像 ...

  9. JS写一个漂亮的音乐播放器

    先放上效果图: 正如图中所展示的播放器那样,我们用HTML+CSS+JS将这个效果实现出来. HTML页面布局 <div class="music"> <div ...

  10. Day5 - D - Conscription POJ - 3723

    Windy has a country, and he wants to build an army to protect his country. He has picked up N girls ...