数据结构期末 数据结构部分
1.栈 栈顶在数组尾 栈底在数组头
2.队列 循环队列 count=maxqueue;
front=0;
rear=maxqueue-1;
利用循环队列 可以很好的利用先前出队元素所剩下的空间
3.堆 extract-max O(logn)
T(n)=2(T(n/2))+O(n)
O(1)=1
insert O(h)=O(logn)
C~CN/2^(l-1)
l-1=logn
4.链表
1)node 包含结点值 和指针
2)插入
中间newPtr->next=prev->next;
prev->next=newPtr;
表头newPtr->next=head;
head=newPtr;
3)删除
中间prev->next=cur->next;
delete cur;
cur=NULL;
表头head=head->next
4)查找
for(prev=NULL,cur=head;cur!=NULL;cur=cur->next)
{if(cur->value==x)
return true;}
return false;
void print(ListNode * head){ if(head!=NULL){ if(head->value==x) cout<<head->value<<endl; else print(head->next); }
5.搜索
通过key找对应的Record为了知道other information
有序列表插入数据
for(position=0;position<s;position++)
{
retrieve(position,list_data);
if (data<list_data)
break;
}
由此可以找到恰好比前一项大比后一项小的位置插入
找到插入位置,并将列表中所有后续数据各自后移一位。
for(int i=count-1;i>=position;i--)
{
entry[i+1]=entry[i];
}
entry[position]=x;
count++;
item>data[middle] first=middle+1
item<data[middle] last=middle-1
递归代码
Error_code recursive_binary_2(const Ordered_list &the_list, const Key &target, int bottom, int top, int &position) { Record data; if (bottom <= top) { int mid = (bottom + top)/2; the_list.retrieve(mid, data); if(data==target) { position=mid; return success;} else if(data>target) recursive_binary_2(the_list,target,mid+1,top,position); else recursive_binary_2(the_list,target,bottom,mid-1,position); } else return not_present; }
循环代码
Record data;
int bottom = 0, top = the_list.size( ) - 1;
while (bottom <= top)
{ position = (bottom + top)/2;
the_list.retrieve(position, data);
if (data == target) return success; if (data < target) bottom = position + 1;
else top = position - 1;
} return not_present;
时间复杂度O(log2n)
n/(2^k)=1
k=log2n
6排序
插入排序 每一遍,排序的序列将增加一个元素。如果序列中有 n 个元素,那么最多进行n 遍即可。
折半插入排序 折半插入排序只减少了比较次数 移动次数不变 O(n^2)
冒泡排序 每次把最大的沉到最底 O(n^2)
归并排序 O(nlogn)T[n] = 2T[n/2] + O(n)
空间复杂度 O(n)
快排 左右往中间移直到ij在同一位置 平均时间复杂度O(nlogn) 最坏O(n^2) 空间复杂度O(log2n)
基数排序 低位基数排序
高位基数排序 最高位排序 再对每个桶次高位基数排序 依次类推
时间复杂度高 速度不一定慢 因为去掉了高阶项系数 也可能n不大
7哈希
开放地址法 查找到为空为止
插入和不成功查找均为找到第一个不为空的 是等价的
8链表leetcode&递归
https://zhuanlan.zhihu.com/p/43142694
题目选择按该专栏
题解基本均为博主自己写的C++代码
移除链表元素
ListNode* removeElements(ListNode* head, int val) { if(head==NULL)return NULL; ListNode * dummy=new ListNode(-1); dummy->next=head; ListNode * cur=dummy; while(cur->next!=NULL) { if(cur->next->val==val) {ListNode * p=cur->next; cur->next=cur->next->next; delete p; } else cur=cur->next; } return dummy->next; }
倒序输出链表的值
void find(ListNode * head) { {if(head->next==NULL) cout<<head->value<<endl; else{find(head->next); cout<<head->value<<endl; } }
https://www.cnblogs.com/kubidemanong/p/10538799.html
反转单链表
reverseLinkedList(ListNode * head) {if(head==NULL||head->next==NULL) return head; ListNode * newNode =reverseLinkedList(head->next); ListNode * t=head->next; t->next=head; head->next=NULL; return newList;}
合并有序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1==NULL)return l2; if(l2==NULL)return l1; if(l1->val>l2->val) {l2->next=mergeTwoLists(l1,l2->next); return l2;} else {l1->next=mergeTwoLists(l1->next,l2); return l1;} }
删除链表中的重复元素
ListNode* deleteDuplicates(ListNode* head) { ListNode * cur=head; while(cur!=NULL&&cur->next!=NULL){ if(cur->val==cur->next->val) { ListNode * deletenode=cur->next; cur->next=cur->next->next; delete deletenode; } else cur=cur->next; } return head; }
旋转单链表
ListNode* rotateRight(ListNode* head, int k) { ListNode *q=new ListNode(-1); if(head==NULL||head->next==NULL)return head; ListNode * x=head; int len=1; while(x->next!=NULL) { len++; x=x->next; } int a=k%len; if(a==0) return head; ListNode * temp=head; while(temp->next->next!=NULL) { temp=temp->next; } ListNode * p=temp; q=temp->next; p->next=NULL; q->next=head; if(a>1) q= rotateRight(q,a-1); return q; }
删除倒数第n个节点
ListNode* removeNthFromEnd(ListNode* head, int n) { if(head==NULL)return NULL; if(head->next==NULL&&n==1)return NULL; if(head->next==NULL&&n==0)return head; ListNode * dummy=new ListNode (0); dummy->next=head; int count=1; ListNode * x=head; while(x!=NULL) { x=x->next; count++; } int todelete=count-n; ListNode * cur=dummy; for(int i=1;i<todelete;i++) { cur=cur->next; } cur->next=cur->next->next; return dummy->next; }
删除链表中节点 参考官方题解的神奇解法orz
void deleteNode(ListNode* node) { node->val=node->next->val; node->next=node->next->next; }
求链表中间节点
ListNode* middleNode(ListNode* head) { if(head==NULL||head->next==NULL)return head; ListNode * fast=head; ListNode * slow=head; while(fast!=NULL&&fast->next!=NULL) { fast=fast->next->next; slow=slow->next; } return slow; }
判断链表是否有环
bool hasCycle(ListNode *head) { if(head==NULL||head->next==NULL)return false; ListNode * fast=head; ListNode * slow=head; while(fast!=NULL&&fast->next!=NULL) { fast=fast->next->next; slow=slow->next; if(fast==slow)return true; } return false; }
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA==NULL||headB==NULL)return NULL; if(headA==headB)return headA; ListNode * p=headA; ListNode * q=headB; while(p!=q) { if(p==NULL)p=headB; else p=p->next; if(q==NULL)q=headA; else q=q->next; } return p; }
两两交换链表中的结点
ListNode* swapPairs(ListNode* head) {
if(head==NULL||head->next==NULL)
{
return head;
}
ListNode * first=head;
ListNode * second=head->next;
ListNode * p=second->next;
second->next=first;
first->next=swapPairs(p);
return second;}