链表后半部分节点倒序插入前半部分节点中

问题描述

将链表后半部分的节点插入到前半部分节点,使得链表1->2->3->4变成1->4->2->3,或者1-2->3->4->5变成1->5->2->4->3
根据上述问题可知,将链表的后一半的节点从后往前依次插入到前半部分的节点中间,第一步需要找到中间节点将链表分成两个部分,前半部分的数量是大于或者等于后半部分的,第二步则是将后半部分的链表逆序,第三步就遍历后半部分的链表,将其插入前半部分的各节点中间

寻找中间节点

	/*
	利用一个空的头节点,加上快慢指针,当快指针或者它的下一个节点指向空,此时慢指针指向的下一个节点,就是后半部分链表的头节点
	*/
	ListNode* fast = new ListNode(0, head);
	ListNode* slow = new ListNode(0, head);
	while (fast)
	{
		if (fast->next != nullptr)
			fast = fast->next->next;
		else
			break;
		slow = slow->next;
	}
	fast = head;
	ListNode* cur = slow->next;
	slow->next = nullptr;

逆序链表

ListNode* tmp1 = nullptr;
	ListNode* tmp2 = cur;
	ListNode* tmp3 = cur->next;
	while (tmp3)
	{
		tmp2->next = tmp1;
		tmp1 = tmp2;
		tmp2 = tmp3;
		tmp3 = tmp3->next;
	}
	tmp2->next = tmp1;

插入节点

	ListNode* pre1 = fast;	//保存插入节点的前一个节点
	ListNode* pre2 = nullptr;//保存插入节点
	while (tmp2)
	{
		fast = fast->next;
		pre1->next = tmp2;	//插入的前一个节点与插入节点连接
		pre2 = tmp2;
		tmp2 = tmp2->next;	
		pre2->next = fast;	//插入的节点和后一个节点连接
		pre1 = fast;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值