链表习题

202 阅读2分钟

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);
}

  1. La Lb Lc(La的头节点)
  2. pa pb 首节点
  3. 循环条件 pa pb 不为空
  4. 相等 La节点,链接到Lc,Lb节点释放
  5. 较小 干掉
  6. 释放多余
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;
    }   
}
  1. 遍历链表 第一个大于mink节点 pre 保存pre
  2. 遍历链表 第一个大于max节点 p 保存pre
  3. pre->next = p
  4. 介于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]

  1. 数据原地逆置 9 8 7 6 5 4 3 2 1 0
  2. 拆解【9 8 7 6 5 4 3】 【2, 1, 0】
  3. 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);
    }
}

  1. 循环计数方式找到链表哪个出现次数最多的
  2. 循环目的:候选人到底出现的次数是多少
  3. 判断是不是候选人 候选人的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;
        }
    }
}