Code5
逻辑部分
#include <bits/stdc++.h>
using namespace std;
struct Node{
int value;
int deleteTag; //1 表示删除
struct Node* next;
};
struct LinkList{
Node* head;
int deleteNum;
int unDeleteNum;
} myList;
void tureDelete(LinkList* list){
Node* now = list->head;
Node* dummyHead = (Node*) malloc(sizeof(Node));
Node* pre = dummyHead; //虚拟头节点, pre 为上一个 **有效** 的节点
while(now){
Node* next = now->next;
if(now->deleteTag == 1){
pre->next = next;
free(now);
now = next; //不需要更新 pre
}else{
pre = now; //更新pre
now = next;
}
}
list->head = dummyHead->next;
}
void lazyDelete(LinkList* list, Node* node){
node->deleteTag = 1; //lazyDelete
list->deleteNum++;
list->unDeleteNum--;
if(list->deleteNum == list->unDeleteNum){
list->deleteNum = 0;
tureDelete(list); // 真正删除
}
}
测试部分
//-----------------测试代码--------------------
int main(){
myList.deleteNum = myList.unDeleteNum = 0;
myList.head = NULL;
for(int i = 1;i <= 10;i++){
Node* node = (Node*) malloc(sizeof(Node));
node->value = i; node->deleteTag = 0;
node->next = myList.head;
myList.head = node;
myList.unDeleteNum++;
}
Node* now = myList.head;
vector<Node*> nodes;
while(now){
cout << now->value << '\n';
nodes.push_back(now);
now = now->next;
}
for(int i = 0;i < 10;i += 2){
lazyDelete(&myList, nodes[i]);
}
cout << "After deletion\n";
now = myList.head;
while(now) {
cout << now->value << '\n';
now = now->next;
}
}
逻辑部分
#include <bits/stdc++.h>
using namespace std;
struct Node{
int data;
int frequent;
Node* pre,* next;
};
struct Ring{
Node* head;
}*myDeque;
void Adjust(Ring*);
void Locate(Ring* ring, int x){
Node* now = ring->head;
//遍历整个循环链表, 对值为 x 的节点 frequent 加 1
do{
Node* next = now->next;
if(now->data == x) now->frequent++;
now = next;
}while(now != ring->head);
Adjust(ring); //进行调整
}
void Adjust(Ring* ring){
Node* now = ring->head, *head = ring->head;
do{
Node* next = now->next;
//向上冒
while(now != head && now->frequent > now->pre->frequent){
swap(now->frequent, now->pre->frequent);
swap(now->data, now->pre->data);
now = now->pre;
}
now = next;
}while(now != head);
}
测试部分
//TEST_CODE
void printRing(Ring* ring){
Node* now = ring->head;
do{
cout << now->data << '\n';
now = now->next;
}while(now != ring->head);
}
int main(){
myDeque = (Ring*)malloc(sizeof(Ring));
vector<Node*> Nodes;
for(int i = 1;i <= 10;i++){
Node* node = (Node*) malloc(sizeof(Node));
node->data = i; node->frequent = 0;
Nodes.push_back(node);
}
for(int i = 0;i < 10;i++){
Nodes[i]->pre = Nodes[(i+9)%10];
Nodes[i]->next = Nodes[(i+1)%10];
}
myDeque->head = Nodes[0];
printRing(myDeque);
cout << "------------------------------------\n";
Locate(myDeque, 10); cout << "Locate 10\n";
Locate(myDeque, 5); cout << "Locate 5\n";
Locate(myDeque, 5); cout << "Locate 5\n";
cout << "------------------------------------\n";
printRing(myDeque);
}

浙公网安备 33010602011771号