c/c++蓝桥杯经典编程题100道(16)链表反转

链表反转

c/c++蓝桥杯经典编程题100道-目录-优快云博客


目录

链表反转

一、题型解释

二、例题问题描述

三、C语言实现

解法1:迭代反转(难度★)

解法2:递归反转(难度★★)

解法3:分组反转(难度★★★)

四、C++实现

解法1:迭代反转(难度★)

解法2:使用STL容器辅助(难度★★)

五、总结对比表

六、特殊方法与内置函数补充

1. C++智能指针

2. 链表调试技巧


一、题型解释

链表反转是将链表节点的连接方向完全逆序的操作。常见题型:

  1. 基础反转:反转整个单链表(如 1→2→3→4→5 转为 5→4→3→2→1)。

  2. 部分反转:反转链表的某个区间(如反转第2到第4个节点)。

  3. 分组反转:每k个节点为一组进行反转(如k=2时,1→2→3→4→5 转为 2→1→4→3→5)。

  4. 递归反转:用递归思想实现链表反转。


二、例题问题描述

例题1:输入链表 1→2→3→4→5,输出反转后的链表 5→4→3→2→1
例题2:输入链表 1→2→3→4→5 和区间 [2,4],输出 1→4→3→2→5
例题3:输入链表 1→2→3→4→5 和k=2,输出 2→1→4→3→5
例题4:输入链表 1→2,输出 2→1


三、C语言实现

解法1:迭代反转(难度★)

通俗解释

  • 像翻书一样,逐个节点改变指针方向,将当前节点的next指向前一个节点。

c

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

// 迭代反转链表
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode *prev = NULL, *curr = head;
    while (curr != NULL) {
        struct ListNode *nextTemp = curr->next; // 保存下一个节点
        curr->next = prev; // 当前节点指向前一个节点
        prev = curr;       // 前一个节点后移
        curr = nextTemp;   // 当前节点后移
    }
    return prev; // prev最终指向新链表的头节点
}

// 打印链表
void printList(struct ListNode* head) {
    while (head != NULL) {
        printf("%d→", head->val);
        head = head->next;
    }
    printf("NULL\n");
}

int main() {
    // 构建链表 1→2→3→4→5
    struct ListNode node5 = {5, NULL};
    struct ListNode node4 = {4, &node5};
    struct ListNode node3 = {3, &node4};
    struct ListNode node2 = {2, &node3};
    struct ListNode node1 = {1, &node2};
    
    struct ListNode* newHead = reverseList(&node1);
    printList(newHead); // 输出 5→4→3→2→1→NULL
    return 0;
}

代码逻辑

  1. 初始化指针prev(前一个节点&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值