【剑指Offer】面试题24. 反转链表

题目

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

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

限制:
0 <= 节点个数 <= 5000

注意:本题同【LeetCode】206. 反转链表

思路一:反转链表元素

取出链表中元素放入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;
}

原文地址:https://www.cnblogs.com/galaxy-hao/p/12343596.html

时间: 2024-08-29 02:49:27

【剑指Offer】面试题24. 反转链表的相关文章

【剑指offer】十,反转链表

题目描述 输入一个链表,反转链表后,输出链表的所有元素. 分析:此题学过数据结构的应该会首先想到链表建立时所采用的头插法,即每一个新插入进来的点均插在链表头.代码如下: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode R

剑指offer系列源码-反转链表

题目1518:反转链表 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1952解决:741 题目描述: 输入一个链表,反转链表后,输出链表的所有元素. (hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数. 输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例, 以此输出链表反转后的元素,如没有元素则输

剑指offer(15)反转链表

题目描述: 输入一个链表,反转链表后,输出新链表的表头. 解题代码: /*function ListNode(x){ this.val = x; this.next = null; }*/ function ReverseList(pHead) { // write code here if(pHead == null || pHead.next == null){ return pHead; } //三个指针,pre指向前一个指针,pHead为当前指针,next为下一个指针 var pre =

【剑指Offer】15、反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头. 题解一:栈 1 public static ListNode ReverseList(ListNode head) { 2 if(head==null||head.next==null){ 3 return head; 4 } 5 Stack<ListNode> stack = new Stack<>(); 6 ListNode current=head; 7 while (current!=null){ 8 stack.pu

剑指offer系列9:反转链表

两个思路: 1.将传来的链表结点一个一个反转,需要使用3个指针,分别指向前结点.当前结点.后结点. 2.从表头开始遍历,每遍历一个结点,将该结点存入一个新链表的头结点. 先说第一个,这个我做的时候有点绕,认真的把结点的指针图画出来理清楚了思路.注释把思路解释的很清楚了,代码如下: 1 #include<iostream> 2 using namespace std; 3 struct ListNode { 4 int val; 5 struct ListNode *next; 6 ListNo

剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如输入数组{5,7,6,9,11,10,8}则返回true,因为这个整数序列是下图二叉树的后序遍历的结果.如果输入的数组是{7,4,6,5},由于没有哪颗二叉搜索树的后续遍历的结果是这个序列,因此返回false. 在后序遍历得到的序列中,最后一个数字是树的根节点的值.数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根节点的值

【剑指Offer面试题】 九度OJ1516:调整数组顺序使奇数位于偶数前面

题目链接地址: http://ac.jobdu.com/problem.php?pid=1516 题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒内存限制:128 兆特殊判题:否提交:2858解决:924 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得全部的奇数位于数组的前半部分,全部的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每一个输入文件包括一组測试案例. 对于每一个測试案例.第一行输入一个n,代表该数组

二叉树层次遍历(剑指Offer面试题32:从上到下打印二叉树)

图1所示为二叉树的层次遍历,即按照箭头所指方向,按照1.2.3的层次顺序,对二叉树每个节点进行访问 (此图反映的是自左至右的层次遍历,自右至左的方式类似). 要进行层次遍历,需要建立一个队列.先将二叉树头节点入队列,然后出队列,访问该节点, 如果它有左子树,则将左子树的根结点入队:如果它有右子树,则将右子树的根结点入队.然后出队列,对出队节点访问, 如此反复直到队列为空为止. 1 import java.util.*; 2 class TreeNode 3 { 4 int val; 5 Tree

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个