链表
1.链表是现行数据结构,C++中,List实现了双向链表,JAVA中LinkedList
2.哑节点:只要设计操作head节点,创建dummycode,ListNode*dummy = new ListNode(0);dummy-> = head;这使得操作head节点与操作其他节点无益。
3.对于寻找链表的某个特定位置的问题,不妨用两个指针变量runner与chaser(ListNode *runner = head, *chaser = head)以不同的速度遍历该链表,找到目标位置。
4.交换节点问题:先交换两个前驱节点的next指针,再交换这两个节点的next指针。
栈和队列(后进先出LIFO和先进先出FIFO)
1.用栈作为辅助,实现深度优先的算法:入栈操作相当与递归调用自身,出栈操作相当于递归返回。入栈操作的对象相当于需要被解决的问题,出栈对象相当于已经解决的问题。
2.解决汉诺塔问题。
enum Tower {Zero, Left, Mid, Right};
class HanoiObj{
public:
Tower src, tmp, dest;
HanoiObj(Tower s, Tower t, Tower d, int n):src(s),tmp(t),dest(d),num(n){
if (n == 1){
index = 1;
}
}
HanoiObj(Tower s, Tower t, Tower d, int i):src(s),dest(d),index(i){
num = 1;
tmp = Zero;
}
};
void move(Tower src, Tower dest, int index){
cout << "Move Disk #" << index << "from Tower" << src << "to Tower" << dest << endl;
}
void TOH (int N){
stack< HanoiObj *> Hstack;
Tower s, t, d;
int n;
Hstack.push(new HanoiObj(Left, Mid, Right, N));
while(!Hstack.empty()){
HanoiObj *tmpObj = Hstack.top();
Hstack.pop();
s = tmpObj -> src;
t = tmpObj -> tmp;
d = tmpObj -> dest;
n = tmpObj -> num;
if (n < 1){
continue;
}
if (n == 1){
move(s,d,tmpObj->index);
} else{
Hstack.push(new HanoiObj(t,s,d,n,-1));
Hstack.push(new HanoiObj(s,d,n));
Hstack.push(new HanoiObj(s,d,t,n,-1));
}
delete tmpObj;
}
}