20141025

1、单链表反转(递归非递归)

ListNode *ReverseList(ListNode *pHead)
{
    if(pHead==NULL||pHead->Next==NULL)
        return pHead;
    ListNode *previousNode=NULL;
    ListNode *nextNode=NULL;
    ListNode *currentNode=pHead;
    while(currentNode!=NULL)
    {
        nextNode=currentNode->Next;
        currentNode->Next=previousNode;
        previousNode=currentNode;
        currentNode=nextNode;
    }
    return previousNode;  //返回的不是currentNode
}

ListNode *ReverseList_recursion(ListNode *currentNode)
{
    if(currentNode==NULL||currentNode->Next==NULL)
        return currentNode;
    ListNode *nextNode=currentNode->Next;
    ListNode *PreviousNode=NULL;
    currentNode->Next=PreviousNode;
    ListNode *newHead=ReverseList_recursion(nextNode);
    nextNode->Next=currentNode;
    return newHead;
}

 

2、单链表是否有环

#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct node
{
    int data;
    struct node * Next;
}ListNode;
ListNode *CreateList()
{
    int x=0;
    int flag=1;
    ListNode *pHead=(ListNode *)malloc(sizeof(ListNode));
    pHead->data=-1;
    pHead->Next=NULL;
    ListNode *rear=pHead;
    while(flag)
    {
        cout<<"input data:";  
        cin>>x;
        if(x!=0){
            ListNode *p=new ListNode[sizeof(ListNode)];
            p->data=x;    
            rear->Next=p;
            rear=p;
        }
        else{
            flag=0;
        }
    
    }
    //rear->Next=pHead;有环
    rear->Next=NULL;//无环链表
    return pHead;
}

bool CircleInList(ListNode *head)
{
    if(head==NULL)
        return false;
    ListNode *pfast,*plow;
    pfast=head;
    plow=head;
    while(pfast!=NULL&&pfast->Next!=NULL)//为了保证pnext=pnext->Next->Next有效,那么pnext->Next!=NULL是条件
    {
        plow=plow->Next;
        pfast=pfast->Next->Next;
        if(pfast==plow)
            return true;
    }
    return false;
}


int main()
{
    ListNode *head=CreateList();
    if(CircleInList(head))
    {
        printf("有环\n");
    }
    else
    {
        printf("无环\n");
    }

    ListNode *backKth=ReverseKthNode(head,2);
    printf("%d",backKth->data);
}

3、传入函数的参数是按值传递时,一定会调用类的拷贝构造函数。

4、深拷贝和浅拷贝,浅拷贝可能会析构同一块内存两次

#include<iostream>
#include<vector>
#include<string>
using namespace std;

class Base
{
public:
    Base(): str(NULL)
    {}
    ~Base(){
        if(str){
            static int i=0; 
            cout<<"&Base"<<i++<<"="<<(int *)this<<",str="<<(int *)str<<endl;//输出该对象的地址和str指针的值
            delete [] str;
        }
    }
    char *str;
};


int main()
{
    Base B;
    B.str=new char[32];
    strcpy(B.str,"trend micro");
    vector<Base> *vec=new vector<Base>() ;
    vec->push_back(B);  //B是按值传递的,调用默认了默认拷贝构造函数,从而发生了浅拷贝
    delete vec;
    return EXIT_SUCCESS;
}

image

5、vector的erase函数删除方法

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
//iterator的使用陷阱:  
vector<int> veci;  
veci.push_back(1);  
veci.push_back(2);  
veci.push_back(3);  
veci.push_back(4);  
veci.push_back(5);  
veci.push_back(3);  
veci.push_back(2);  
veci.push_back(3);
/*for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)  
{  
      if( *iter == 3)  
          veci.erase(iter);  
}*/错误做法
//这样使用是错误的,因为earase结束后,iter变成了野指针,iter++就产生了错误。
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end();)  //正确做法
{  
      if( *iter == 3)  
          iter=veci.erase(iter);  
     else
         iter++
}
  
}

6、pop_只删除,空间大小不变

7、remove和erase合用

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
int main()
{
    vector<int> veci;
    veci.push_back(1);
    veci.push_back(2);
    veci.push_back(3);
    veci.push_back(3);
    veci.push_back(4);
    veci.push_back(5);
    veci.push_back(6);
    veci.push_back(7);
    veci.push_back(8);
    veci.push_back(9);
    vector<int>::iterator p=remove(veci.begin(),veci.end(),3);
    veci.erase(p,veci.end());//一定要包含algorithm头文件,不然remove会被当做另一个删除文件使用的remove函数
}
8、定义对象和对象指针
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
class A
{
public:
    A(){}
    A(int x,int y):x(x),y(y)
    {}
    void f()
    {cout<<"f被调用"<<endl;}
private:
    int x,y;
};

int main()
{
    A a(3,4);
    A b;
    A c();  //不是定义对象,而是一个函数声明
    c.f(); //c不是A的对象,所以出错
    A *pa=new A();
    A *pa1=new A(3,4);
}

9、只有静态整型常量可以在类中初始化

  const int a = 1;  //error: 只有静态整型常量可以在类中初始化

  static const int h = 1;         //ok

  static const double h1 = 1.0;   //error: 只有静态整型常量才能在类中初始化

10、类的静态成员函数不能访问类的非静态成员函数,只能访问静态成员变量

static int getvalue()
{
    return a;//a是非静态成员变量
}

11、静态成员变量的初始化要在类的外部

static int A::member=1;

12、类中的常量必须在初始化成员列表中初始化

class A{

public:
    A():bb(1){}
    const int bb;

}

 

13\\\\

posted @ 2014-10-26 17:57  yexuannan  阅读(158)  评论(0编辑  收藏  举报