链表K个节点翻转

题目描述:

给出一个链表和一个数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). 提示:这个题是链表逆置的升级变型。

结果分析:

题目思路:

利用栈的先进后出的性质,

1、将需要翻转的结点压入栈中;

2、将需要翻转的最后一节结点的后一个结点保存下来;

3、定义一个头结点,将栈中结点,取栈顶结点,链接起来;

4、当栈中数据全部取出后,将保存的后一个结点链接起来;返回头结点即可。


代码实现:

ListNode* RotateList(ListNode* list, size_t k)
{
	assert(list);
	assert(k >= 0);

	ListNode* head;
	if (k == 0)
		return list;
	else
	{
		stack<ListNode*> s;
		ListNode* p = list;
		for (int i = 0; i < k; i++)  //将需要翻转的结点压入栈中
		{
			if (p != NULL)
			{
				s.push(p);
				p = p->next;
			}
		}

		ListNode* node = p;//保存需翻转结点的后一个节点
		head = p = s.top();//连接节点数据
		s.pop();
		int size = s.size();
		for (int i = 0; i < size; i++)
		{
			p->next = s.top();
			s.pop();
			p = p->next;
		}
		p->next = node;
	}
	return head;
}

如果需要翻转N个节点:时间复杂度为:O(N)

测试用例:

void Text()
{
	ListNode* n1 = new ListNode(1);
	ListNode* n2 = new ListNode(2);
	ListNode* n3 = new ListNode(3);
	ListNode* n4 = new ListNode(4);
	ListNode* n5 = new ListNode(5);
	ListNode* n;
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = n5;
	/* n = RotateList(n1, 0);
	 n = RotateList(n1, 1);
	 n = RotateList(n1, 2);*/
	/* n = RotateList(n1, 3);*/
	/* n = RotateList(n1, 4);*/
	/* n = RotateList(n1, 5);*/
	 n = RotateList(n1, 6);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值