C++面试(9)-----反转链表

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

输入一个链表,输出该链表反转之后的链表。例如:

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

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

解决方案

这个问题可以通过多种方法解决,包括递归法和迭代法。下面分别介绍这两种方法。

方法一:迭代法

使用三个指针来逐步反转链表中的每一个节点,直到遍历完整个链表。
代码实现(C++)

struct ListNode {
    int val;
    ListNode* next;
    ListNode( int x ) : val( x ), next( nullptr ) {}
};

ListNode* reverseList( ListNode* head )
{
    ListNode* prev = nullptr;  // 前驱节点
    ListNode* curr = head;     // 当前处理的节点
    while ( curr != nullptr )
    {
        ListNode* nextTemp = curr->next;  // 暂存当前节点的下一个节点
        curr->next         = prev;        // 将当前节点指向前驱节点
        prev               = curr;        // 移动前驱节点到当前节点
        curr               = nextTemp;    // 移动到下一个待处理节点
    }
    return prev;  // 新的头节点是原链表的最后一个节点
}

int main()
{
    ListNode* node1 = new ListNode(1);
    node1->next = new ListNode(2);
    node1->next->next = new ListNode(3);
    node1->next->next->next = new ListNode(4);
    node1->next->next->next->next = new ListNode(5);

    ListNode* res = reverseList(node1);

    ListNode *head = res;
    while(res != nullptr)
    {
        
        std::cout<< res->val<<std::endl;
        res = res->next;
    }
}

输出:

5
4
3
2
1

方法二:递归法

递归地反转链表,对于每个节点,假设其后续节点已经被正确反转,然后调整当前节点的指向。

代码实现(C++)

struct ListNode {
    int val;
    ListNode* next;
    ListNode( int x ) : val( x ), next( nullptr ) {}
};
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;  // 返回新的头节点
}

int main()
{
    ListNode* node1 = new ListNode(1);
    node1->next = new ListNode(2);
    node1->next->next = new ListNode(3);
    node1->next->next->next = new ListNode(4);
    node1->next->next->next->next = new ListNode(5);

    ListNode* res = reverseList(node1);

    ListNode *head = res;
    while(res != nullptr)
    {

        std::cout<< res->val<<std::endl;
        res = res->next;
    }
}

输出:

5
4
3
2
1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值