白天的小萤火虫

导航

2.23记录

1、关于2条单向链表是否存在交点的问题,只能Y字型,方法是遍历两条链表,看他们的尾指针是否相同,相同则有交点,进而求交点的位置,两条链的长度为M,N,如果M>N,则短链从头开始扫,长链从M-N处开始扫,如果发现相同点,则为交点。

2、链表是否有环,用一快(2)一慢(1)的指针,如果他们相遇了,则说明有交点,如果需要找点环的开始节点,则这样做:当第一次相交后,再一快一慢的扫一次,第二次遇上的时候,他们走的步长差值就为环的长度,有了这个长度M,则用M长的火车从头开始扫,当这列火车头尾相遇,则相遇点就是环的入口处。

还有一个链表反转的问题,主要是注意递归版本的实现,想了好久

#include<iostream>
using namespace std;
struct Node{int a;Node *next;};
Node
* reverseLinkList(Node* head)
{
Node
*p1,*p2,*p3;
p1
= NULL;
p2
= head;
p3
= p2->next;
while(p3)
{
p2
->next = p1;
p1
= p2;
p2
= p3;
p3
= p3->next;
}
return p1;
}
//attention the last node is NULL node(as the null head when creation)
Node* reverseLinkList_recursion(Node* curr,Node* &head){
if(curr->next->next == NULL){//因为原始链表的尾巴那个节点是没有用的空节点
curr
->next = NULL;//断掉原始链表
head
= curr;//这里改变新的head指针
return curr;
}
Node
* tmp = reverseLinkList_recursion(curr->next,head);
tmp
->next = curr;//把当前节点连接到返回的那个节点后面
curr
->next = NULL;//注意这里要吧当前节点断链,这相对于从原始链表中拿走,否则会出现死循环
}

int main(){
Node
*head = new Node;
int a[] = {1,2,3,4,5};
for(int i = 4; i >= 0; i--){
Node
*pt = new Node;
pt
->a = a[i], pt->next = head, head = pt;
}
cout
<<endl<<"the list: ";
for(Node* p3 = head;p3->next != NULL;p3 = p3->next)//尾巴那个节点是没有用到的空节点
cout
<<p3->a;
cout
<<endl<<"the reverse list: ";
// Node *newhead = reverseLinkList(head);
Node *newhead = reverseLinkList_recursion(head,head);
for(Node* p3 = head;p3 != NULL;p3 = p3->next)
cout
<<p3->a;
cout
<<endl;
return 0;
}

3、再次回顾一下stl

对于vector:assign是对vector进行重新赋值操作,at是取index为i的元素值,back是取vector的尾部元素引用,begin是取vector开头迭代器,capacity是得到vector已经分配好的空间大小,clear是清除vector,empty是判断vector是否为空,end是返回vector中最后一个迭代器(最后一个元素的下一个),erase是擦除元素注意其返回迭代器为被擦除元素的后一个迭代器,front返回vector首部的一个元素引用,insert是返回被插入的那个元素的迭代器,max_size是得到潜在的最大的空间大小,pop_back是删掉最后一个元素(会使size大小减少1),push_back是add一个元素到尾部(使size大小加1,有可能会使size与capacity的大小一样),rbegin是返回反向的那个迭代器(最后一个元素,但是和back不同,因为他们的迭代器类型不同),rend是返回反向的那个迭代器(第一个元素),reserve,resize,size三个函数之间的关系,reserve可以分配总的空间,size是目前一共有多少个元素,resize是重新设定元素的个数(补全或者删除);第一个会影响capacity,后两个不会影响capacity总的空间,swap是两个vector交换值。

对于deque:assign是对deque重新赋值,at是返回第i个元素的引用,back返回最后一个元素的引用,begin是返回第一个迭代器,clear是清除deque,empty是判断deque是否为空,end返回最后一个迭代器(最后一个元素的下一个),erase是擦除元素注意其返回迭代器为被擦除元素的后一个迭代器,front是返回第一个元素的引用,insert是返回被插入的那个元素的迭代器,max_size是得到潜在的空间大小,pop_back是删掉最后一个元素(会使size大小减少1),pop_front是删掉第一个元素(size减少1),push_back是add一个元素到尾部(使size大小加1,之前的迭代器会失效),push_front是add一个元素到首部(size+1),rbegin是返回反向的那个迭代器(最后一个元素,但是和back不同),rend是返回反向的那个迭代器(第一个元素),resize的作用与vector中一样,size也是目前存在的元素个数,swap是两个deque交换值。

对于list:assign是对list重新赋值,back返回最后一个元素的引用,begin是返回第一个迭代器,clear是清除list,empty是判断list是否为空,end返回最后一个迭代器(最后一个元素的下一个),erase是擦除元素注意其返回迭代器为被擦除元素的后一个迭代器,front是返回第一个元素的引用,insert是返回被插入的那个元素的迭代器,max_size是得到潜在的空间大小,merge两条有序list,pop_back是删掉最后一个元素(会使size大小减少1),pop_front是删掉第一个元素(size减少1),push_back是add一个元素到尾部(使size大小加1),push_front是add一个元素到首部(size+1),remove按值去掉一些元素会影响size大小,resize作用与vector中的resize类似,reverse反转list,size返回存在的元素个数,sort排序list,splice拼接两个list(注意要是it被变动后,则它就不合法了),swap交换两条list,unique将list中重复的元素只留下一个版本。

对于set:begin返回第一个迭代器,clear将set清空(size为0),count返回key为x的元素个数(set只能为1或者0),empty判断set是否为空,end返回最后一个迭代器,equel_range返回一对迭代器pair(就是lower_bound和upper_bound的返回迭代器),erase擦除set中元素(size会减少),find返回找到的那个元素的迭代器(没有找到返回set::end),insert返回一个pair(第一个是插入点的迭代器,第二个表示插入成功与否),lower_bound返回一个迭代器(迭代器里的元素不小于key),upper_bound返回一个迭代器(迭代器里的元素大于key),max_size是得到潜在的空间大小,rbegin和rend,size返回存在的元素个数,swap交换两个set。

对于multiset:和set类似,其key可以duplicate而已。find只会返回找到的第一个,要找到所有值为key的用equal_range。

对于mapbegin 返回第一个迭代器,clear将map清空(size为0),count返回key为x的元素个数(map只能为1或者0),empty判断map是否为 空,end返回最后一个迭代器,equel_range返回一对迭代器pair(就是lower_bound和upper_bound的返回迭代 器),erase擦除map中元素(size会减少),find返回找到的那个元素的迭代器(没有找到返回map::end),insert返回一个pair(第一个是插入点的迭代器,第二个表示插入成功与否),lower_bound返回一个迭代器(迭代器里的元素不小于key),upper_bound返回一个迭代器(迭代器里的元素大于key),max_size是得到潜在的空间大小,rbegin和rend,size返回存在的元素个数,swap交换两个set。

对于multimap:因为是duplicate。find只会返回找到的第一个,要找到所有值为key的用equal_range。

三个函数的申明分别是:
void* realloc(void* ptr, unsigned newsize);
void* malloc(unsigned size);
void* calloc(size_t numElements, size_t sizeOfElement);
都在stdlib.h函数库内

它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL

malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:
char* p;
p=(char*)malloc(20);

calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如:
char* p;
p=(char*)calloc(20,sizeof(char));
这个例子与上一个效果相同

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度


posted on 2011-02-25 14:51  白天的小萤火虫  阅读(207)  评论(0编辑  收藏  举报