倒序打印单链表

书中有一问题:

编写倒序打印单链表的算法,只是用常数的附加空间。本题意味着,不能使用递归但可以假设该算法是表的一个成员函数。

通读题目,可以知道题目告诉我们,用递归可以完成;或者借助附加空间,那么借助栈可以完成;借助常数的附加空间,那么就需要一个固定的大小去完成,给他三个指针,去反转链表吧。

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值