链表反转+交叉链接

给个链表1->2->3->4->5->6
把它变成1->6->2->5->3->4

先把后半段链表反转,然后交叉链接前后半段链表即可

#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <unordered_map>
#include <map>
#include <unordered_set>
#include <stack>

using namespace std;

struct ListNode
{
	int val;
	ListNode* next;
	ListNode(int x) :val(x),next(NULL) {};
};

ListNode* reverse(ListNode* root)
{
	ListNode* new_head = root, * node = root->next;
	while (node)
	{

		root->next = node->next;
		node->next = new_head;
		new_head = node;
		node = root->next;
	}
	return new_head;
}
/*
给个链表1->2->3->4->5->6
把它变成1->6->2->5->3->4

先把后半段链表反转,然后交叉链接前后半段链表即可
*/
ListNode* changeList(ListNode* root)
{
	int len = 0;
	ListNode* node = root, * past_head = NULL, * new_head = root, * p = root, * q, * p_next, * q_next;
	while (node)
	{
		len++;
		node = node->next;
	}
	node = root;
	int cnt=0;
	while (cnt<len/2-1)
	{
		node = node->next;
		cnt++;
	}
	
	past_head = reverse(node->next); //past_head 指向后半段链表
	node->next=NULL;  // 这儿要特别注意,一定要将前半段链表末位指向NULL,不然会死循环
	
	cnt = 0;
	q = past_head;
	while (q)
	{
		p_next = p->next;
		q_next = q->next;
		p->next = q;
		q->next = p_next;
		p = p_next;
		q = q_next;
	}
	
	return new_head;
}

int main()
{
	ListNode* p1 = new ListNode(3);
	ListNode* p2 = new ListNode(2);
	ListNode* p3 = new ListNode(1);
	ListNode* p4 = new ListNode(4);

	p1->next = p2;
	p2->next = p3;
	p3->next = p4;


	ListNode* res = changeList(p1);
	
	while (res)
	{
		cout << res->val<<" ";
		res = res->next;
	}
	
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值