基本的算法实践在上一篇博文,这篇博文向大家详细展示一下数据结构的高级应用,可能有些难,但这是重点,实用性很强,而且用的好往往事半功倍,想获得力量吗,开整:
我把他们分为这几块:
- 链表反转:反转单向链表或双向链表。
- 检测链表环:判断链表中是否存在环。
- 合并两个有序链表:将两个有序链表合并成一个有序链表。
- 从链表中删除重复节点:删除链表中的重复节点。
- 链表排序:对链表进行排序(例如归并排序)。
下面一一用代码给出展示,代码完整,可以直接复制下来自己摸索,自己修改执行,也可以自己保留复习,话不多说,代码见:
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);
}
是不是发现了一个尽分享干货的博主,创作属实不易,希望大家珍惜!