链表翻转。比如给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5

这是一个关于链表翻转的问题,给定一个链表和整数k,需要实现翻转链表的每k个节点。例如,对于链表1→2→3→4→5→6和k=2,翻转后得到2→1→4→3→6→5。算法思路是先按k分组,然后翻转每个组,最后将组连接起来。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表翻转

题目:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型。

算法思想:

这个题是链表逆置的升级变型,我们可以将此链表先按照以k为单位分为若干个小链表,再将小链表进行翻转,最后将小链表链接起来,依次进行,当小链表的长度小于k时,将其直接连接在链表后面即可。

部分代码图示:


代码实现:

#include 
#include 
#include 

typedef int DataType;

typedef struct ListNode
{
	DataType _data;
	struct ListNode* _next;
}Node,*pNode,*pList;


void Init(pList* pplist)
{
	assert(pplist);
	*pplist = NULL;
}


pNode BuyNode(DataType x)
{
	pNode pnode = (pNode)malloc(sizeof(Node));
		if (pnode == NULL)
		{
			perror("malloc");
			return NULL;
		}
		pnode->_data = x;
		pnode->_next = NULL;
		return pnode;
}

void Push(pList* pplist,DataType x)
{
	pNode NewNode = BuyNode(x);
	if (*pplist == NULL)
	{
		*pplist = NewNode;
	}
	else
	{
		pNode cur = *pplist;
		while (cur->_next)
		{
			cur = cur->_next;
		}
		cur->_next = NewNode;
	}
}


pNode Reverse(pList plist)
{
	pNode cur = plist;
	if(cur == NULL)
		return NULL;
	if (cur->_next)
	{
		Reverse(cur->_next);
	}
	printf("%d ", cur->_data);
	return cur;
}


pNode getLastNode(pList plist)
{
	pNode pHead = plist;
	while (pHead->_next != NULL)
	{
		pHead = pHead->_next;
	}
	return pHead;

}

pNode SwapListByK(pList plist, size_t k)
{
	pNode pnode = plist;
	pNode pNewNode;
	pNode pNextNode;
	pNode LastNode = NULL;
	pNode tmp = NULL;
	size_t pos;
	if (k <= 1)
		return plist;
	
	plist = NULL;
	while (pnode)
	{
		pos = 0;
		pNewNode = pnode;
		while (pnode && pos < k - 1)
		{
			tmp = pNewNode;
			pnode = pnode->_next;
			if (pnode == NULL)
			{
				break;
			}
			pos++;
		}
		if (pnode == NULL)
		{
			return tmp;        //如果需要反转的不足k个元素,则直接连在后面
		}
		if (pnode)
		{
			pNextNode = pnode->_next;
			pnode->_next = NULL;
			if (LastNode != NULL)
			{
				LastNode->_next = NULL;
			}
			pNewNode = Reverse(pNewNode);
			if (plist == NULL)
				plist = pNewNode;
			else
				LastNode->_next = pNewNode;

			pnode = getLastNode(pNewNode);
			pnode->_next = pNextNode;
			LastNode = pnode;
			pnode = pNextNode;
		}
		else
		{
			break;
		}
	}
	return pnode;
}

void Printf(pList plist)
{
	pList cur = plist;
	while (cur)
	{
		printf("%d ", cur->_data);
		cur = cur->_next;
	}
	printf(" NULL\n");
}

void Test()
{
	pList plist;
	Init(&plist);
	Push(&plist, 1);
	Push(&plist, 2);
	Push(&plist, 3);
	Push(&plist, 4);
	Push(&plist, 5);
	Push(&plist, 6);
	Push(&plist, 7);
	Printf(plist);

	pNode ret = SwapListByK(plist, 3);
	Printf(ret);
	
}
测试结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值