朱建国 发布的文章

双向链表的特点:
1、以节点为单位,每个节点有上个节点指针和下个节点指针
2、至少包含头节点和尾节点
3、添加节点时先改变新增节点的上下节点指针指向,后修改前后节点的指针指向为当前节点
4、删除节点时修改当前节点的前后节点指向,然后删除当前节点
5、迭代器用来封装节点数据,并提供了操作符的能力,如*,++,==,!=
6、列表的操作有:取头,取尾,删头,删尾,删指定位置,加头,加尾,加指定位置

template
class List
{
private:

struct Node
{
    Object data;
    Node *prev;
    Node *next;

    Node(const Object &d = Object(), Node *p = NULL, Node *n = NULL)
        : data(d), prev(p), next(n)
    {

    }
};

public:

class const_iterator
{
public:
    const_iterator() : current(NULL)
    {

    }

    const Object &operator* () const
    {
        return retrieve();
    }

    const_iterator & operator++ ()
    {
        current = current->next;
        return *this;
    }

    const_iterator operator++ (int)
    {
        const_iterator old = *this;
        ++(*this);
        return old;
    }

    bool operator == (const const_iterator &rhs) const
    {
        return current == rhs.current;
    }

    bool operator != (const const_iterator &rhs) const
    {
        return !(*this == rhs);
    }

protected:
    Node *current;
    Object &retrieve() const
    {
        return current->data;
    }
    const_iterator(Node *p) : current(p)
    {

    }

    friend class List < Object >;
};

class iterator : public const_iterator
{
public:
    iterator()
    {

    }

    Object & operator* ()
    {
        return retrieve();
    }

    iterator &operator++()
    {
        current = current->next;
        return *this;
    }

    iterator operator++ (int)
    {
        iterator old = *this;
        ++(*this);
        return old;
    }

protected:
    iterator(Node *p) : const_iterator(p)
    {

    }

    friend class List < Object >;
};

public:

List()
{
    init();
}
~List()
{
    clear();
    delete head;
    delete tail;
}
List(const List &rhs)
{
    init();
    *this = rhs;
}

const List &operator = (const List &rhs)
{
    if (this == &rhs)
    {
        return *this;
    }
    clear();
    for (const_iterator itr = rhs.begin(); itr != rhs.end(); ++itr)
    {
        push_back(*itr);
    }

    return *this;
}

iterator begin()
{
    return iterator(head->next);
}

const_iterator begin() const
{
    return const_iterator(head->next);
}

iterator end()
{
    return iterator(tail);
}

const_iterator end() const
{
    return const_iterator(tail);
}

int size() const
{
    return theSize;
}
bool empty() const
{
    return size() == 0;
}

void clear()
{
    while (!empty())
        pop_front();
}

Object &front()
{
    return *begin();
}

const Object & front() const
{
    return *begin();
}
Object &back()
{
    return *--end();
}
const Object &back() const
{
    return *--end();
}
void push_front(const Object &x)
{
    insert(begin(), x);
}
void push_back(const Object &x)
{
    insert(end(), x);
}
void pop_front()
{
    erase(begin());
}
void pop_back()
{
    erase(--end());
}

iterator insert(iterator itr, const Object &x)
{
    Node *p = itr.current;
    theSize++;
    return iterator(p->prev = p->prev->next = new Node(x, p->prev, p));
}
iterator erase(iterator itr)
{
    Node *p = itr.current;
    iterator retVal(p->next);
    p->prev->next = p->next;
    p->next->prev = p->prev;
    delete p;
    theSize--;

    return retVal;
}

iterator erase(iterator start, iterator end)
{
    for (iterator itr = start; itr != end;)
    {
        itr = erase(itr);
    }

    return end;
}

private:

int theSize;
Node *head;
Node *tail;
void init()
{
    theSize = 0;
    head = new Node;
    tail = new Node;
    head->next = tail;
    tail->prev = head;
}

};

int main()
{

List<int> nList;
nList.push_back(1);
nList.push_back(2);
nList.push_back(3);
nList.push_back(4);
for (List<int>::const_iterator itr = nList.begin(); itr != nList.end(); itr++)
{
    LOG_INFO("itr vaule:" << *itr);
}

//
for (List<int>::iterator itr = nList.begin(); itr != nList.end(); )
{
    nList.erase(itr++);
}

LOG_INFO("List size:" << nList.size());
reutrn 0;

}

二分搜索法特点:
1、数据顺序排列
2、每次去取最中间的数值
3、根据目标数和中间数的大小,调整最小值索引或最大值索引范围
4、直至匹配或者无法继续3的操作

template;
int BinarySearch(const std::vector &nVector, const CompareData &nData)
{

int nLow = 0;
int nHigh = nVector.size() - 1;
while (nLow &lt;= nHigh)
{
    int nMid = (nLow + nHigh) / 2;

    if (nVector[nMid] &lt; nData)
    {
        nLow = nMid + 1;
    }
    else if (nVector[nMid] &gt; nData)
    {
        nHigh = nMid - 1;
    }
    else
    {
        return nMid + 1;
    }
}

return -1;

}

int main()
{

std::vector<int> nVector;
for (int i = 0; i < 10; i++)
{
    nVector.push_back(i);
}

int result = BinarySearch(nVector, 5);
LOG_INFO("result:" << result);

}

递归特点:

1、有基准情况(base case),则结束

2、其他情况继续调用自己

//0: 0
//1 : 1
//2 : 2 + 4 = 6
//3 : 12 + 9 = 21
//4 : 42 + 16 = 58
//5 : 116 + 5 * 5 = 141
unsigned int DoOpera(unsigned int x)
{

if (x <= 0)
    return 0;

return (2 * DoOpera(x - 1) + x * x);

}
int main()
{

unsigned int result = DoOpera(5);
LOG_INFO("result:" << result);
return 0;

}

1、心流。
即一个人完全沉浸在某种活动当中,无视其他事物存在的状态,这种状态本身带来莫大的喜悦。
2、幸福来源。
只有不计好坏,全身心投入到生活的每一个细节时,才会觉得幸福。
3、心流经验
一个人可以投入全部的注意力,以求实现目标;没有脱序现象需要整顿,自我也没有受到任何威胁,因此不要分心防卫,我们称之为“心流经验”
4、心流体验的八项元素:
难度适中、全身关注、明确的目标、即时反馈、忘却烦恼、掌控自如、忘却事件
5、难度和技巧要达到平稳态。
难度过大,受打击;难度过小,无趣。挑战和行动力要恰好平衡。
6、全神贯注。
忘却不快乐的事情,是心流经验的重要特征
7、闲暇不等于快乐。
大量的闲暇并不能转化为乐趣。跟我们的祖先比较,我们享受人生的机会太多,但事实上我们一点也不比他们快乐。
8、意识趋疲是常态
除非一个人知道如何整顿自己的思想,否则注意力一定会被当时最棘手的事情所吸引:它会集中于某种真实或者想象的痛苦,最近的不快的挫折中。意识趋疲是意识的常态,一种既没有任何作用,又不能带来乐趣的状态。
9、学会独处。
意识具有趋疲常态,因此需要对意识组序。组序分两种,被动组序和主动组序。看电视,看电影,听音乐是被动组序;做运动,写文章是主动排序。主动排序更容易获得心流体验。

1、四象限法则。
事情分为四种:重要不紧急,重要紧急,不重要紧急,不重要不紧急。处理优先级按照以上顺序执行,所谓人无远虑,必有近忧,重要而不紧急的事,需要优先处理,这样就不会轻易转换成重要紧急的事。

2、背猴子法则。
不要把事情都拦在自己身上,学会推走身上的猴子,不该做的事情,让别人去做。

3、心流体验。
专注。成就感。反馈。

4、行动的定义。
时间、地点、事情、结果。