📜  数据结构|链表|问题5(1)

📅  最后修改于: 2023-12-03 15:26:09.556000             🧑  作者: Mango

链表问题5

链表问题5是关于链表反转的问题,即将原链表中的元素顺序颠倒并返回一个新链表。

问题描述

给出一个链表,对其进行反转操作。例如,对于链表 1->2->3->4->5 转换后变成 5->4->3->2->1

解决方案

反转链表的一般做法是用三个指针依次遍历链表,分别指向当前节点、当前节点的前一个节点和后一个节点。在遍历的过程中,将当前节点的指针指向前一个节点,然后更新指针位置。当遍历到链表末尾时,前一个节点就是反转后的链表的头节点。

具体的实现步骤如下:

  1. 定义三个指针 prevcurrnext 分别表示前一个节点、当前节点和后一个节点。初始化时 prevNULLcurr 为链表的头节点,nextcurr->next 前进一步;
  2. 循环遍历链表,每次将当前节点的指针指向前一个节点,然后更新指针位置,直到链表末尾;
  3. 返回这个反转后的链表的头节点 prev

下面是具体的代码实现:

#include <iostream>

using namespace std;

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

ListNode* reverseList(ListNode* head) {
    ListNode *prev = NULL, *curr = head, *next;
    while (curr != NULL) {
        next = curr->next; // 保存当前节点的下一个节点
        curr->next = prev; // 当前节点指向前一个节点
        prev = curr; // 前一个节点指针前移
        curr = next; // 当前节点指针前移
    }
    return prev; // 返回新的头节点
}

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

    head = reverseList(head);

    ListNode *curr = head;
    while (curr != NULL) {
        cout << curr->val << " ";
        curr = curr->next;
    }
    cout << endl;

    return 0;
}
时间复杂度

反转链表的时间复杂度为 $O(n)$,其中 $n$ 表示链表中节点的个数。

空间复杂度

反转链表的空间复杂度为 $O(1)$,即只需要常数的额外空间来保存链表中的节点指针。