为嘛是再写,其实关于Data Structure,我觉得自己真心已经疼爱过他们一次了,奈何学艺不精,所以一直想找机会再仔细看一次,这样既然再次有了疼爱他们的机会,那么也就认真的再爱一次。
C到C++,感觉像折翼的天使。好吧,其实问题的关键是在于不要流程化思维和硬想要的OOP思维。
另外,C++的野心太大:
template模板/通用编程
以及 语法糖
还有 编译重载
有的时候让C++读起来显得吓人,晦涩难懂,特别是对于初学者。
还是不能一口吃掉一个大饼,还是先写类似C的C++,再来写像C++的C++.
$ clang++ -std=c++11 -stdlib=libc++ t.cpp
不谢
struct node{ int data; node* next; }
值得注意的是: 如果要在头上插入node,这里传入的时 node *&head
所谓的pass by reference,如果写C的话,那么估计应该写 node **head
// pass head by reference, since the head will be changed void insertFront(node *&head, int n){ node *tmp = new node; tmp->data = n; tmp->next = NULL; if (head == NULL) { head = tmp; } else { tmp->next = head; head = tmp; } }
这里其实不引入curr变量应该也ok,因为传入的是node* head,把head这个pointer按值传入
void traverse(node* head){ for (node* curr = head; curr != NULL; curr = curr->next) cout << curr->data << " "; cout << endl; }
跟for循环异曲同工
void traverse2(node* head){ while (head) { cout << head->data <<" "; head = head->next; } cout << endl; }
用递归来traverse
void traverseRec(node* head){ if (head == NULL) return; cout << head->data << " "; traverseRec(head->next); }
bool findVal(node *head, int val){ if (head == NULL) return false; if (head->data == val) return true; return findVal(head->next,val); }
还可以返回值的地址我调皮的打印发现NULL的地址是0x0;
node* find(node *head, int val){ if (head == NULL) return NULL; if (head->data == val) return head; return find(head->next,val); }
void deleteNode(node *&head, int n){ //if not found, just return; if (!findVal(head,n)) return; node* prev = NULL; node* curr = head; // the delete node is at head if (head->data == n){ head = head->next; delete curr; } else { while (curr->data != n) { prev = curr; curr = curr->next; } prev->next = curr->next; delete curr; } }
没有在这个上面花second thought,挑了一个方便走的方向就赶着走了出来,或许这个是可以优化的
void reverseList(node *&head){ node* prev = NULL; node* curr = head; node* next = NULL; while (curr != NULL) { next = curr->next; curr->next = prev; prev = curr; curr = next; } head = prev; }
void reverseListRec(node* &head){ node* first; node* rest; if (head == NULL) return; first = head; rest = first->next; if (rest == NULL) return; reverseListRec(rest); first->next->next = first; first->next = NULL; head = rest; }
无论是recursive还是loop类型的reverse linked list都让我感觉是真神作算法啊~
P.S. 太懒了,暂时就把代码折让扔着,然后等待更简洁,更可爱,更迷人,更可人的linkelist_v2吧(假装就是这样)