逆置单链表

我自己的方法是用的递归,毕竟也是接触了一点点点点点点 scheme 的骚年是吧,代码如下:

ListNode* reverseList(ListNode* head) {
    if (head == nullptr){
        return nullptr;
    }

    ListNode* newHead = nullptr;

    function<void(ListNode*)> reverse;
    reverse = [&](ListNode* node)
    {
        if (node->next == nullptr){
            newHead = node;
            return;
        }

        reverse(node->next);
        node->next->next = node;
        node->next = nullptr;
    };
    reverse(head);
    return newHead;
}

毕竟是递归,我琢磨着会不会迭代会快一点,于是有了如下版本:

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

    ListNode* previous = head;
    ListNode* current  = head->next;
    ListNode* next     = nullptr;
    while (current != nullptr){
        next = current->next;
        current->next = previous;
        previous = current;
        current  = next;
    }
    head->next = nullptr;
    return previous;
}

结果也是 8ms 啊,令人失望。

时间: 2024-10-14 04:01:40

逆置单链表的相关文章

常见算法题:逆置单链表

思路:使用头插法建立单链表,每插入一个节点都插在头结点之后,先使头结点指向NULL,再将剩余结点使用头插法建表,即可实现单链表逆置. 代码: 设目标单链表L,结点为int类型 void Reverse(LinkList &L) { int *p = L.head->next,*q; L.head->next = NULL; while(p!=NULL) { q = p->next; p->next = L.head->next; L.head->next = p

逆置单链表(0957)swust-oj

Description 建立长度为n的单链表,然后将其数据元素逆置,即第1个元素变为最后一个元素,第2个元素变为倒数第2个元素,……,最后一个元素变为第1个元素.(处理的数据类型为字符型.必须使用链表完成.) Input 第一行为链表长度n: 第二行为链表中的n个数据元素的值. Output 逆置后的原始的值. Sample Input 10 A B C D E F G H I Sample Output I H G F E D C B A 分析:逆制,只需要用头插法建立单链表即可: 代码: #

课后习题 3.10 用栈逆置单链表

LinkList.h #pragma once #include<iostream> using namespace std; class LNode { public: int data; LNode* next; }; class LinkList { public: LNode* first; LinkList() { first = new LNode(); first->data = 666; first->next = nullptr; } void creat(int

逆序单链表

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

微软算法100题24 就地逆序单链表

第24 题:链表操作,单链表就地逆置 思路: 本来想拿两个指针分别指向当前节点和上一节点,在向后移动指针的过程中将当前节点的next指针逆向为上一节点,但这样就无法继续向后移动当前节点了.... 转换一下思路,对于n各节点,逆序的操作可以分解为把后面n-1个节点逆序,然后再把第一个节点放在已经逆序好的n-1个元素后面就可以了 -> f(n) = [f(n-1), 1] 最后还是回到了递归上... 其实递归是不是也可以归于divide&conquer范畴呢? 1 package com.rui

【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)

建立源文件List.cpp include "List.h" int main() {     Test();     system("pause");     return 0; } 建立头文件List.h #ifndef __LISH_H__ #define __LISH_H__ #include<iostream> using namespace std; typedef int DataType; struct ListNode {     Li

数据结构69:链表逆置,链表反转,链表翻转

链表翻转,简单地理解,就是将链表的头部结点变为链表的尾部结点,与此同时将原链表的尾部结点变成头部结点.如下图所示: 图 1 链表翻转示意图 提示:H 为头指针,图示中的链表无头结点,头指针直接指向首元结点. 将链表进行翻转的方法有多种,本节给大家介绍两种实现方法. 方法一 实现链表翻转最直接的方法就是:从链表的头部开始遍历每个结点,改变每个结点的指向,即将原本指向下一个结点的指针改为指向上一个结点. 唯一比较特殊的是,链表中的首元结点(第一个结点)前面没有结点,所以在改变其指针指向的时候,要将其

基础数据结构——单链表

线性表根据存储结构可以分为链式存储和顺序存储. 顺序存储实际上可以理解为结构体数组,要求逻辑上相邻的元素在物理上也是相邻的: 而链式存储没有这样的要求,这样就便于元素的插入删除操作(顺序存储在插入删除操作时需要移动大量的元素). 定义单链表结点 typedef struct Node{ int element; //结点元素 struct Node* next; //结点指针 }Node,*LinkList; LinkList CreateList_head(); LinkList Create

带头节点的单链表

//带头结点的单链表 #include <iostream> #include <stdlib.h> using namespace std; typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; void InitList(LinkList *L); void Create_head(LinkList l); void Create_rear(