2014美团网笔试题里有一道链表反转的题目,要求是给出一个链表和一个数,求这个链表的分段反转。比如输入1->2->3->4->5->6和2,输出为2->1->4->3->6->5;若数为3,输出3->2->1->6->5->4;若为4,输出4->3->2->1->5->6。
我的方法是用栈,代码如下:
#include<stack>
using namespace std;
stack<Link*> s;
void LinkTest()
{
printf("enter link elem:\n");
char c;
Link* LinkHead = NULL;
Link* LinkIndex = NULL;
int LinkLen = 0;
// 链表初始化
while ((c = getchar()) != '\n')
{
if (c == ' ')
continue;
if (LinkLen == 0)
{
LinkHead = new Link;
LinkHead->elem = c;
LinkIndex = LinkHead;
LinkIndex->next = NULL;
}
else
{
LinkIndex->next = new Link;
LinkIndex = LinkIndex->next;
LinkIndex->elem = c;
LinkIndex->next = NULL;
}
LinkLen++;
}
printf("\n");
printf("enter reverse length:\n");
int RevLen;
scanf("%d",&RevLen);
printf("\n");
if (RevLen < 1)
return;
// 反转链表
LinkIndex = LinkHead;
int count1 = 0;
Link* Pre = NULL;
while(LinkIndex != NULL)
{
if (count1 % RevLen == 0 && count1 != 0)
{
if (Pre == NULL)
LinkHead = s.top();
else
Pre->next = s.top();
Link* LinkTmpHead = s.top();
Link* LinkTmp = s.top();
s.pop();
while(!s.empty())
{
LinkTmp->next = s.top();
LinkTmp = LinkTmp->next;
s.pop();
}
Pre = LinkTmp;
LinkTmp->next = LinkIndex;
}
if (LinkIndex != NULL)
{
s.push(LinkIndex);
LinkIndex = LinkIndex->next;
}
count1++;
}
// 显示反转后的链表
LinkIndex = LinkHead;
while(LinkIndex != NULL)
{
printf("%c",LinkIndex->elem);
LinkIndex = LinkIndex->next;
}
printf("\n");
}