链表
提纯
记录一下我踩的坑吧…真够蠢的
- 没加abs,因为题目是绝对值…
- 删除元素以后pos应该–,或者删除的时候pos不++,传参的时候传pos+1
- 拿一个指针记录上一次的位置!
- 把其它题目adt复制过来了,忘了原题是个循环链表…
- new出来的数组没有初始化0…
template<class ElemType> void Delete_Equal_Node( LinkList<ElemType> &A, int N ) { int *arr = new int[N+1]; for(int i = 0; i < N; ++i) arr[i] = 0; LinkNode<ElemType> *p = A.GetHead()->next, *t; int pos = 0; while(p) { p = p->next; } p = A.GetHead()->next; while(p) { if(!arr[abs(p->data)]) { arr[abs(p->data)] = 1; t = p; pos++;
}else { p = t; A.ListDelete(pos+1); } p = p->next;
} }
|
有序归并
当b比a长的时候,要把b接在a后边,还要注意b本身也要提纯。。
void Merge_L_Order( LinkList<ElemType> &A, LinkList<ElemType> &B ) { LinkNode<ElemType> *pa = A.GetHead()->next, *pb = B.GetHead()->next, *t1=A.GetHead(), *t2; int pos = 1; while(pa) { if(!pb) break; if(pb->data < pa->data) {
t2 = pb->next; A.ListInsertNode(t1, pb); pa = pb; pb = t2;
}else if(pb->data == pa->data) { t2 = pb->next; delete pb; pb = t2; }else { pos ++; t1 = pa; pa = pa->next; } } if(pb) A.GetTail()->next = pb; while(pb && pb->next) { if(pb->next->data == pb->data) { t1 = pb->next; pb->next = t1->next; delete t1; }else { pb = pb->next; } } if(pb) A.SetTail(pb); delete B.GetHead(); B.GetTail()->next = NULL; }
|