华为机试 - 链表翻转

链表翻转。给出一个链表和一个数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→6→5,用程序实现

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

struct ListNode
{
	int val;
	ListNode *link;
	ListNode(int v):val(v),link(NULL){ }
};
ListNode* reverse(ListNode *first, ListNode *second)
{
	if(first->link==second)
		return first;
	ListNode *temp=first->link;
	ListNode *pAhead=first->link,*pMid=pAhead->link,*pBehind=NULL;
	pAhead->link=second->link;
	while (pMid!=second)
	{
		pBehind=pMid->link;
		pMid->link=pAhead;
		pAhead=pMid;
		pMid=pBehind;
	}
	second->link=pAhead;
	first->link=second;
	return temp;
}

ListNode* reverseList(ListNode *head, int k)
{
	if(k==0||k==1)
		return head;
	ListNode *leader=new ListNode(0);
	leader->link=head;
	ListNode *fisrt=leader,*second=NULL,*temp=NULL;
	int k_backup=k;
	if(k>6)
	{
		second=fisrt->link;
		while (second!=NULL)
		{
			temp=second;
			second=second->link;
		}
		reverse(fisrt,temp);
	}
	else
	{
		while (head!=NULL)
		{
			temp=head;
			head=head->link;
			k--;
			if(k==1)
			{
				second=head;
				fisrt=reverse(fisrt,second);
				k=k_backup;
				head=fisrt->link;
				temp=head;
			}
		}
		if(fisrt->link!=NULL)
		{
			reverse(fisrt,temp);
		}
	}
	temp=leader->link;
	delete leader;
	return temp;
}

int main()
{
	int n=6,k;
	cin>>k;
	ListNode *head=new ListNode(1);
	ListNode *temp=head;
	for (int i=2;i<=n;i++)
		temp->link=new ListNode(i),temp=temp->link;
	temp=reverseList(head,k);
	while(temp!=NULL)
	{
		cout<<temp->val<<' ';
		temp=temp->link;
	}
	cout<<endl;
	system("pause");
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值