单链表复制算法:空间复杂度O(1)实现

本文介绍一种单链表复制算法,该算法的空间复杂度为O(1),即不使用额外的空间来存储复制后的链表。

算法设计思想

算法的基本设计思想是在单链表类中增加一个名为copy(L)的功能,实现单链表的复制。要求算法的空间复杂度为O(1),即不使用额外的空间来存储复制后的链表。

C++代码实现

#include <iostream>

class ListNode {
public:
    int val;
    ListNode* next;

    ListNode(int value) {
        val = value;
        next = nullptr;
    }
};

class LinkedList {
private:
    ListNode* head;

public:
    LinkedList() {
        head = nullptr;
    }

    void insert(int value) {
        ListNode* newNode = new ListNode(value);
        if (head == nullptr) {
            head = newNode;
        }
        else {
            ListNode* curr = head;
            while (curr->next != nullptr) {
                curr = curr->next;
            }
            curr->next = newNode;
        }
    }

    LinkedList copy() {
        LinkedList newList;
        ListNode* curr = head;

        while (curr != nullptr) {
            newList.insert(curr->val);  // 复制当前节点的值并插入到新链表中
            curr = curr->next;
        }

        return newList;
    }

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

int main() {
    LinkedList list1;
    list1.insert(1);
    list1.insert(2);
    list1.insert(3);

    LinkedList list2 = list1.copy();  // 复制list1到list2
    list2.display();

    return 0;
}

关键代码注释

  1. ListNode类表示链表的节点,包含一个整数值和指向下一个节点的指针。
  2. LinkedList类表示链表,包含一个指向头节点的指针。
  3. insert()函数用于向链表中插入一个新节点,如果链表为空则将新节点设为头节点,否则找到链表的尾节点插入新节点。
  4. copy()函数创建一个新的链表newList,遍历原始链表,将每个节点的值复制并插入到newList中。
  5. display()函数用于打印链表中的元素。

空间复杂度分析

该算法的空间复杂度为O(1),因为仅使用了有限的额外空间来存储新链表的节点,而不是使用额外的数据结构。

总结

本文介绍了一种单链表复制算法,该算法的空间复杂度为O(1),并且给出了C++代码实现和关键代码注释。该算法简洁高效,适用于需要在有限空间内复制单链表的场景。

单链表复制算法:空间复杂度O(1)实现

原文地址: https://www.cveoy.top/t/topic/bBx5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录