书中有一问题: 编写倒序打印单链表的算法,只是用常数的附加空间。本题意味着,不能使用递归但可以假设该算法是表的一个成员函数。 通读题目,可以知道题目告诉我们,用递归可以完成;或者借助附加空间,那么借助栈可以完成;借助常数的附加空间,那么就需要一个固定的大小去完成,给他三个指针,去反转链表吧。 ps:实验结果基于之前自己实现的 简易List (是双链表且含有初始化data=0的头尾节点,不过不影响操作) 递归: 如果你知道如何顺序打印,那么换一种思路就是倒序打印的代码啦~ Node * getHead() { return head; } void printList(Node * head) {//递归 //cout << head->data; //顺序打印 if (head->next) printList(head->next); cout << head->data; //倒序打印 } 借助栈: 对于栈就比较好想了,对于单链表中的每一个元素,不断地入栈,根据栈先进后出的性质,然后依次出栈即为倒序~ void printList() {//借助栈 stack s; Node * p = head; while (p != nullptr) { s.push(p->data); p = p->next; } while (!s.empty()) { cout << s.top(); s.pop(); } } 反转链表: (我承认我参考了书的答案,就看了初始化,瞬间豁然开朗) 这个函数的参数返回形式确实刁钻,开始自己写的几个总是不成功,用了返回Node<Object> * 加上如下的测试代码,终于自己写的简易List不在因为迭代器的指针初始化为nullprt报错,不过测试代码就不要计较太多了~ //这个函数加到List类内 Node<Object> * getHead() { return head; } Node<int> * p = L1.reverseList(L1.getHead()); L1.printList(p); cout << endl; p = L1.reverseList(p); L1.printList(p); Node * reverseList(Node * head) { //直接反转链表 Node * currentPos, *nextPos, *previousPos; currentPos = head; previousPos = nullptr; nextPos = head->next; while (nextPos != nullptr) { currentPos->next = previousPos; previousPos = currentPos; currentPos = nextPos; nextPos = nextPos->next; } currentPos->next = previousPos; return currentPos; }