`

单链表翻转(C++ 实现)

 
阅读更多
// Type your C++ code and click the "Run Code" button!
// Your code output will be shown on the left.
// Click on the "Show input" button to enter input data to be read (from stdin).

#include <iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
 
ListNode *reverseBetween(ListNode *head, int m, int n) {
    if(!head) return NULL; 
    if(m >= n) return head;
    if(!head->next) return head;
    
    // dummy head
    ListNode *dh = new ListNode(0);
    dh->next = head;
    
    ListNode *pre = dh;
    ListNode *last = head;
    ListNode *cur = last->next;
    
    for(int i = 1; i < m; i++) {
        pre = pre->next;
        last = last->next;
        cur = cur->next;
    }
    
    for(int i = m; i < n; i++) {
        last->next = cur->next;
        cur->next = pre->next;
        pre->next = cur;
        cur = last->next;
    }
    
    ListNode *ret = dh->next;
    
    delete dh;
    dh = NULL;
    
    return ret;
}

void printList(ListNode *head) {
    ListNode *cur = head;
    int c = 0;
    while(cur) {
        cout<<cur->val<<" ";
        cur = cur->next;
        c ++;
    }
    cout<<"  ||  "<<c<<endl;
}


int main() {  
    ListNode *head = new ListNode(1);
    ListNode *cur = head;
    for(int i = 2; i < 20; i++) {
        ListNode *n = new ListNode(i);
        cur->next = n;
        cur = n;
    }
    
    printList(head);
    ListNode *rh = reverseBetween(head, 2, 3);
    printList(rh);
    
    char c;
    cin>>c;
    
    return 0;
}

 

欢迎关注微信公众号——计算机视觉:

分享到:
评论

相关推荐

    单链表翻转

    c++实现单链表的翻转,有输入输出,一目了然。欢迎交流学习

    C++实现单链表删除倒数第k个节点的方法

    "C++实现单链表删除倒数第k个节点的方法" 在C++编程中,单链表是一种常用的数据结构,删除单链表中的倒数第k个节点是一种常见的操作。本文将详细介绍C++实现单链表删除倒数第k个节点的方法,并结合实例形式分析了...

    单链表综合实验.docx

    在本实验中,我们将实现一个单链表的类,包括链表的创建、链表元素的插入、链表元素的查找、链表元素的删除、打印所有的链表元素、翻转链表等操作。 链表的创建 在本实验中,我们使用模板类来实现单链表,链表的每...

    c\c++链表实例

    - 翻转链表:改变每个节点的next指针,使其指向当前的前驱节点,实现链表反转。 5. 链表的优缺点: - 优点:动态扩展性好,插入和删除操作相对快速,不需预先知道数据大小。 - 缺点:访问速度慢,因为需要从头...

    K 个一组翻转链表(每次k个翻转+递归)1

    目标是给定一个单链表和一个整数 k,将链表中的节点按 k 个一组进行翻转,同时保持每组内部的相对顺序不变。如果链表的长度不是 k 的整数倍,那么剩下的部分应该保持原样。 首先,我们来看链表的定义。链表由一系列...

    三种线性数据结构的实现

    - **数组实现(AQueue.cpp)**:队列是先进先出(FIFO)的数据结构,数组实现中通常使用双端数组,一端入队,另一端出队,当一端达到数组边界时,需要进行数组的翻转或重新分配空间。 - **链式实现(LQueue.cpp)*...

    Leetcode答案(c++版)

    ### LeetCode C++解答概述 #### 一、链表(LinkedList) **1.1 Add Two Numbers (2)** - **问题描述**:给定两个非空链表来表示两个非负整数。数字最高位位于链表的首位。将这两个数字相加并返回一个新的链表。 -...

    基于teapack实现的头插法

    Teapack是一个可能的C++库,它提供了各种数据结构和算法的实现,包括链表。使用Teapack,我们可以方便地实现头插法,因为它可能已经为我们提供了链表类和其他辅助工具。要使用Teapack进行头插法,我们需要了解其API...

    tstl2cl_1.0

    例如,链表的节点需要手动分配和释放内存,向量需要动态扩展数组,而map和红黑树则需要实现复杂的树操作,如旋转、颜色翻转等,以确保其平衡性。 项目"tstl2cl_1.0"中的源代码将详细展示如何在C语言中实现这些功能...

    高级C语言 学完C语言来看这个绝对收获

    C/C++实现冒泡排序算法 冒泡排序是一种简单的排序算法,它重复地遍历列表,比较每对相邻项,必要时交换它们。关键步骤包括: - **初始化一个标志**:用于检测列表是否已经排序完毕。 - **遍历列表**:从第一个...

    实验报告9

    实验代码包括了`LinkList.cpp`、`CycleLinkList.cpp`、`Stack.cpp`和`Queue.cpp`四个文件,分别对应单链表、循环链表(可能用于链式队列的循环结构)、堆栈和队列的实现。 通过这个实验,学生能够深入理解链表、...

    每日一道编程题精选篇.pdf

    这说明本习题集可能会让学生学习和实践如何用C/C++实现各种数据结构和算法。 “适用于考研党数据结构复习使用”和“题库选取极具代表性,包罗万象”强调了习题集内容的深度和广度,覆盖了考研中可能遇到的各种数据...

    苏大数据结构题目

    4. 在线性表改进的单链表实现中,`mutable`关键字的作用是允许在常量对象中修改`current`指针所指向的节点,使得程序可以**在只读对象上进行修改操作**。 5. 二分查找方法适用于**有序**的数据文件,且通常限于**...

    isPallindrome-GeeksforGeeks-:给定一个单链列表,编写一个函数,如果给定列表是回文,则返回true,否则返回false

    这个题目来自于知名编程学习网站GeeksforGeeks,它要求我们实现一个C++函数来判断一个单链表是否为回文。在这个问题中,我们将探讨如何利用链表的数据结构特性来解决这个问题。 首先,我们要明白链表的基本概念。...

    c语言常用算法源代码

    在编程领域,C语言因其简洁、高效和广泛的适用性,被广泛用于系统开发、嵌入式编程以及算法实现。《C语言常用算法》一书及其配套的源代码库,为学习者提供了丰富的实践素材,帮助程序员更好地理解和运用各种经典算法...

    世界500强面试题.pdf

    1.2.7. 翻转句子中单词的顺序....................................................................... 31 1.2.8. 判断整数序列是不是二元查找树的后序遍历结果 ................................ 33 1.2.9. 查找...

Global site tag (gtag.js) - Google Analytics