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是重新申请的地址长度


转载于:https://www.cnblogs.com/mahatma/archive/2011/02/25/1963266.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值