void MergeList(LinkList *La, LinkList *Lb, LinkList *lc) {
LinkList pa,pb,pc,temp;
pa = (*La)->next;
pb = (*Lb)->next;
*Lc = *La;
pc = *La;
while(pa && pb) {
if(pa->data < pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
} else (pa->data > pb->data) {
pc->next = pb;
pc = pb;
pb = pb->next;
} else {
pb->next = pa;
pa = pa->next;
temp = pb->next;
free(pb)
pb = temp;
}
}
pc->next = pa ? pa : pb;
free(*Lb);
}
- La Lb Lc(La的头节点)
- pa pb 首节点
- 循环条件 pa pb 不为空
- 相等 La节点,链接到Lc,Lb节点释放
- 较小 干掉
- 释放多余
void Insertsection(LinkList *La, LinkList *Lb,LinkList *Lc) {
LinkList pa, pb, pc, temp;
pa = (*L)->next;
pb = (*L)->next;
*Lc = *La;
pb = *La;
while(pa && pb) {
if (pa->data == pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
temp = pb;
pb = pb->next;
free(temp);
} else if (pa->data < pb->data) {
temp = pa;
pa = pa->next;
free(temp);
} else {
temp = pb
pb = pb->next;
free(temp);
}
}
while(pa) {
temp = pa;
pa = pa->next;
free(temp);
}
while(pb) {
temp = pb;
pb = pb->next;
free(temp);
}
pc->next = NULL;
}
void Inverse(LinkList *L) {
LinkList p, temp;
p = (*L)->next;
(*L)->next = NULL;
while(p) {
temp = p;
p = p->next;
temp->next = (*L)->next;
(*L)->next = temp;
}
}
- 遍历链表 第一个大于mink节点 pre 保存pre
- 遍历链表 第一个大于max节点 p 保存pre
- pre->next = p
- 介于pre和p之间的节点删除
void DeleteMinMax(LinkList *L, int mink, int max) {
LinkList p,q,pre, temp;
pre = *L
p = (*L)->next;
while(p && p->data < mink) {
pre = p;
p = p->next;
}
while(p && p->data <= max) {
p = p->next;
}
q = pre->next;
pre->next = p;
while(q! = p) {
temp = q;
q = q->next;
free(temp);
}
}
[0,1,2,3,4,5,6,7,8,9]
- 数据原地逆置 9 8 7 6 5 4 3 2 1 0
- 拆解【9 8 7 6 5 4 3】 【2, 1, 0】
- n-p数据/p个数据 再次逆序 3 4 5 6 7 8 9 0 1 2
void Revert(int *pre, int left, int right) {
int i = left, j = right;
int temp;
while(i < j) {
temp = pre[i];
pre[i] = pre[j];
pre[j] = pre[i];
i++;
j--;
}
}
void LeftShift(int *pre, int nm int p) {
if(p > 0 && p < n) {
Revert(pre, 0, n-1);
Revert(pre, 0, n - p - 1);
Revert(pre, n-p, n-1);
}
}
- 循环计数方式找到链表哪个出现次数最多的
- 循环目的:候选人到底出现的次数是多少
- 判断是不是候选人 候选人的count > n/2
int MainElement(int *A, int n) {
int count = 1;
int key = A[0];
for(int i = 1; i < n; i++) {
if(A[i] == key) {
count++;
} else {
if(count > 0) {
count--;
} else {
// 更换候选人
key = A[i];
count = 1;
}
}
}
if(count > 0) {
for(int i = count = 0; i < n; i++) {{
if(A[i] == key) {
count++;
}
}
}
if(count > n / 2) {
return key;
}
return -1;
}
void DeleteEqualNode(LinkList *L, int n) {
int *p = alloc(sizeof(int) * n);
LinkList r = *L;
for(int i = 0; i < n; i++) {
*(p+i) = 0;
}
LinkList temp = (*L)->next;
while(temp) {
if(p[abs(temp->data)] == 1) {
r->next = temp->next;
free(temp);
temp = r->next;
} else {
p[abs[temp->data]] = 1;
r = temp;
temp = temp->next;
}
}
}