数据结构之链表(高级应用)

基本的算法实践在上一篇博文,这篇博文向大家详细展示一下数据结构的高级应用,可能有些难,但这是重点,实用性很强,而且用的好往往事半功倍,想获得力量吗,开整:

我把他们分为这几块:

  1. 链表反转:反转单向链表或双向链表。
  2. 检测链表环:判断链表中是否存在环。
  3. 合并两个有序链表:将两个有序链表合并成一个有序链表。
  4. 从链表中删除重复节点:删除链表中的重复节点。
  5. 链表排序:对链表进行排序(例如归并排序)。

下面一一用代码给出展示,代码完整,可以直接复制下来自己摸索,自己修改执行,也可以自己保留复习,话不多说,代码见:

C语言实现单向链表的高级操作

1. 链表反转
ListNode* reverse_list(ListNode* head) {
    ListNode* prev = NULL;
    ListNode* current = head;
    ListNode* next = NULL;
    while (current != NULL) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    return prev;
}
2. 检测链表环
int has_cycle(ListNode* head) {
    ListNode *slow = head, *fast = head;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            return 1;
        }
    }
    return 0;
}
3. 合并两个有序链表
ListNode* merge_sorted_lists(ListNode* l1, ListNode* l2) {
    if (!l1) return l2;
    if (!l2) return l1;
    if (l1->value < l2->value) {
        l1->next = merge_sorted_lists(l1->next, l2);
        return l1;
    } else {
        l2->next = merge_sorted_lists(l1, l2->next);
        return l2;
    }
}
4. 从链表中删除重复节点
void remove_duplicates(ListNode* head) {
    ListNode* current = head;
    while (current != NULL && current->next != NULL) {
        if (current->value == current->next->value) {
            ListNode* next_next = current->next->next;
            free(current->next);
            current->next = next_next;
        } else {
            current = current->next;
        }
    }
}
5. 链表排序(归并排序)
ListNode* sorted_merge(ListNode* a, ListNode* b) {
    if (!a) return b;
    if (!b) return a;
    if (a->value <= b->value) {
        a->next = sorted_merge(a->next, b);
        return a;
    } else {
        b->next = sorted_merge(a, b->next);
        return b;
    }
}

void front_back_split(ListNode* source, ListNode** front, ListNode** back) {
    ListNode* fast = source->next;
    ListNode* slow = source;
    while (fast != NULL) {
        fast = fast->next;
        if (fast != NULL) {
            slow = slow->next;
            fast = fast->next;
        }
    }
    *front = source;
    *back = slow->next;
    slow->next = NULL;
}

void merge_sort(ListNode** head_ref) {
    ListNode* head = *head_ref;
    if ((head == NULL) || (head->next == NULL)) {
        return;
    }
    ListNode* a;
    ListNode* b;
    front_back_split(head, &a, &b);
    merge_sort(&a);
    merge_sort(&b);
    *head_ref = sorted_merge(a, b);
}

C++实现双向链表的高级操作

1. 链表反转
void reverse_list() {
    DoubleListNode *temp = nullptr;
    DoubleListNode *current = head;
    while (current != nullptr) {
        temp = current->prev;
        current->prev = current->next;
        current->next = temp;
        current = current->prev;
    }
    if (temp != nullptr) {
        head = temp->prev;
    }
}
2. 检测链表环
bool has_cycle() {
    DoubleListNode *slow = head, *fast = head;
    while (fast != nullptr && fast->next != nullptr) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            return true;
        }
    }
    return false;
}
3. 合并两个有序链表
DoubleListNode* merge_sorted_lists(DoubleListNode* l1, DoubleListNode* l2) {
    if (!l1) return l2;
    if (!l2) return l1;
    if (l1->value < l2->value) {
        l1->next = merge_sorted_lists(l1->next, l2);
        if (l1->next != nullptr) {
            l1->next->prev = l1;
        }
        l1->prev = nullptr;
        return l1;
    } else {
        l2->next = merge_sorted_lists(l1, l2->next);
        if (l2->next != nullptr) {
            l2->next->prev = l2;
        }
        l2->prev = nullptr;
        return l2;
    }
}
4. 从链表中删除重复节点
void remove_duplicates() {
    DoubleListNode* current = head;
    while (current != nullptr) {
        DoubleListNode* runner = current->next;
        while (runner != nullptr) {
            if (current->value == runner->value) {
                DoubleListNode* next = runner->next;
                if (runner->prev) {
                    runner->prev->next = runner->next;
                }
                if (runner->next) {
                    runner->next->prev = runner->prev;
                }
                delete runner;
                runner = next;
            } else {
                runner = runner->next;
            }
        }
        current = current->next;
    }
}
5. 链表排序(归并排序)
DoubleListNode* sorted_merge(DoubleListNode* a, DoubleListNode* b) {
    if (!a) return b;
    if (!b) return a;
    if (a->value <= b->value) {
        a->next = sorted_merge(a->next, b);
        a->next->prev = a;
        a->prev = nullptr;
        return a;
    } else {
        b->next = sorted_merge(a, b->next);
        b->next->prev = b;
        b->prev = nullptr;
        return b;
    }
}

void split(DoubleListNode* source, DoubleListNode** front, DoubleListNode** back) {
    DoubleListNode* fast = source->next;
    DoubleListNode* slow = source;
    while (fast != nullptr) {
        fast = fast->next;
        if (fast != nullptr) {
            slow = slow->next;
            fast = fast->next;
        }
    }
    *front = source;
    *back = slow->next;
    slow->next = nullptr;
}

void merge_sort(DoubleListNode** head_ref) {
    DoubleListNode* head = *head_ref;
    if ((head == nullptr) || (head->next == nullptr)) {
        return;
    }
    DoubleListNode* a;
    DoubleListNode* b;
    split(head, &a, &b);
    merge_sort(&a);
    merge_sort(&b);
    *head_ref = sorted_merge(a, b);
}

是不是发现了一个尽分享干货的博主,创作属实不易,希望大家珍惜!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值