裸指针对链表的相关操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了裸指针对链表的相关操作相关的知识,希望对你有一定的参考价值。

struct Node
{
    int value      = 0;
    Node* next = nullptr;
    Node(int value_) : value(value_) {}
};

Node* createLinkList(const std::vector<int>& data)
{
    if (data.empty()) {
        return nullptr;
    }
    auto head = new Node(data.front());
    Node* tail = head;
    std::for_each(data.cbegin() + 1, data.cend(),
        [&](int value)
    {
        tail->next = new Node(value);
        tail = tail->next;
    });
    return head;
}

void printLinkList(Node* head)
{
    while (head) {
        std::printf("%d ", head->value);
        head = head->next;
    }
}

void destroyLinkList(Node* head)
{
    if (head == nullptr) {
        return;
    }
    if (head->next) {
        destroyLinkList(head->next);
    }
    delete head;
}

Node* reverseLinkList(Node* old_head)
{
    Node* new_head = nullptr;
    while (old_head) {
        Node* next = old_head->next;
        old_head->next = new_head;
        new_head = old_head;
        old_head = next;
    }
    return new_head;
}

Node* removeDuplicates(Node* head)
{
    if (head == nullptr){
        return head;
    }
    for (auto it = head; it->next;){
        if (it->value == it->next->value){
            Node* next = it->next->next;
            delete it->next;
            it->next = next;
        }else{
            it = it->next;
        }
    }
    return head;
}

void moveHead(Node** dest_ref, Node** source_ref)
{
    auto new_head  = *source_ref;
    *source_ref    = new_head->next;
    new_head->next = *dest_ref;
    *dest_ref      = new_head;
}

void sortedInsert(Node** head_ref, Node* new_node)
{
    Node** current_ref = head_ref;
    while ((*current_ref != nullptr) &&
           (*current_ref)->value < new_node->value){
        current_ref = &((*current_ref)->next);
    }
    new_node->next = *current_ref;
    // 前一个结点保存的地址和当前结点的二级指针的解引用是同一个,
    // 都是 *current_node
    *current_ref   = new_node;
}

void insertSort(Node** head_ref)
{
    Node* new_head = nullptr;
    // 如果 for 的第三段使用 it = it->next,是不是一样呢?
    // 当然不是,因为此时的 it 已经被移动了,所以此时的 it 是在新的链表中,
    // it->next 得到的是新链表中的 next Node.
    // 所以要在 it 移动之前保留一份移动前的 next.
    for(Node* it = *head_ref, *next; it; it = next){
        next = it->next;
        sortedInsert (&new_head, it);
    }
    *head_ref = new_head;
}

 

以上是关于裸指针对链表的相关操作的主要内容,如果未能解决你的问题,请参考以下文章

(2021.9.16)针对数组和链表的时间复杂度详解

(2021.9.16)针对数组和链表的时间复杂度详解

(2021.9.16)针对数组和链表的时间复杂度详解

(2021.9.16)针对数组和链表的时间复杂度详解

一文讲透链表操作,看完你也能轻松写出正确的链表代码

一文讲透链表操作,看完你也能轻松写出正确的链表代码