《剑指offer》之——单链表的翻转

一直以来对算法有一种恐惧感,在没有刷题的情况下就匆忙开始秋招笔试。然后结果可想而知,除了一些原题以及一些非常常见的题目可以动手(然而自己编写却出现很多问题),对于大部分的需要稍微思考的算法题,通常是丈二的和尚摸不着头脑。秋招之后,觉得算法的基础过于薄弱,于是开始陆陆续续刷算法题,现终于差不多刷完《剑指offer》以及相关题目。于是准备对常见的算法题进行一个总结,结合良好思路和自己的理解记录在博客上。以此来勉励自己,如有错误或者不合理的地方,也希望得到读者的反馈和纠正以便共同进步!


单链表的翻转

对于顺序结构中数组的翻转,将从前往后遍历改为从后往前遍历。而为了正确翻转一个链表,必须调整链表中指针的方向,因为链表并不是连续存储的,而是通过一条条“链条”连接起来的。

分别确定是三个节点,prev,pcur,pnext,为了使原链表翻转,必须修改指针的指向,首先我们让pur指向prev,这个时候为了防止pnext断链,所以我们必须还要保存pnext。然后依次向后遍历,让prev指向pcur,并且pcur指向pnext,直到pcur为空。最后,保存原链表的尾节点即为翻转后的单链表的首节点。

ListNode *reverse(ListNode *head)
{
	//首先判断头结点是否为空或者头结点的下一个节点是否为空
	if (head == nullptr || head->next == nullptr) return head;
	ListNode *prev = head; //前节点
	ListNode *pcur = head->next;// 当前节点
	ListNode *pnext = nullptr; //后节点
	while (pcur != nullptr)
	{
		pnext = pcur->next; //保存下一个节点
		pcur->next = prev; //改变指针指向
		//依次向后遍历
		prev = pcur;
		pcur = pnext;
	}
	//确定新链表的头结点,就是原链表的尾节点
	head->next = nullptr;
	head = prev;
	return head;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值