常见算法题:逆置单链表

思路:使用头插法建立单链表,每插入一个节点都插在头结点之后,先使头结点指向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;
        p = q;
    }
}

该算法的时间复杂度为O(n),空间复杂度为O(1)。

时间: 2024-10-05 03:10:10

常见算法题:逆置单链表的相关文章

算法题:反转单链表

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:存在一个单链表,头指针为head,实现单链表的反转Node *Reverse(Node *head).  该算法的求解办法有很多,如: 方法1:先顺序变量单链表,将结点保存到栈中,在从栈中弹出结点,重新建立一个新的单链表: 方法2:用<剑指offer>里面给出的算法,用三个指针来实现: 方法3:采用递归实现,是方法2的递归实现形式. 本文主要给出方法2和方法3,在给出具体的代码之前,先要注意几个问题:          (1)如果hea

逆置单链表(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 分析:逆制,只需要用头插法建立单链表即可: 代码: #

逆置单链表

我自己的方法是用的递归,毕竟也是接触了一点点点点点点 scheme 的骚年是吧,代码如下: ListNode* reverseList(ListNode* head) { if (head == nullptr){ return nullptr; } ListNode* newHead = nullptr; function<void(ListNode*)> reverse; reverse = [&](ListNode* node) { if (node->next == nu

课后习题 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

算法题:复制复杂链表之空间换时间法

说明:本文仅供学习交流,转载请标明出处,欢迎转载!  题目:复制一个复杂链表,所谓复杂链表指的是每个节点含有两个指针,一个指向单链表的下一个结点,一个指向单链表中的任意某个结点,或者该指针为空. 为了方便起见,我们将待复制的链表称为原型链表,将复制后的新链表称为复制链表,将指向下一个结点的指针定义为next指针,指向其他位置的指针定义为any指针.<剑指offer>上给出了三种解决方法:(1)常规法:(2)空间换时间法:(3)紧随复制法.书上并给出了第三种方法的实现代码.这里我根据书上的提示,

算法题:复制复杂链表之复制连接法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章算法题:复制复杂链表之空间换时间法我们给出了用映射的方法来为新复制的链表中的每个结点设置any指针,本文给出的是<剑指offer>上给出的算法与代码,<剑指offer>上提到该算法的实现三个步骤:        第一步:复制原始链表的任意结点N并创建新结点N',在把N'连接到N的后面:        第二步:设置每个结点的any指针:        第三步:将长链表分成两个链表,一个是原始链表,另外一个就是我们所要求的复制

逆序单链表

? 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

【算法题 14 LeetCode 147 链表的插入排序】

算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class Solution(object): def insertionSortList(self, head): """ :type head: ListNode

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

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