// revert link at interval.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
typedef struct node
{
int val;
struct node* next;
}
Node;
/*
1->2->3->4->5->6->7
3->2->1->6->5->4->7
*/
Node* revertLinkAt(Node* head, int N)
{
Node *pNewHead = NULL;
Node *pNewRear = NULL;
Node *pMidHead = NULL;
Node *pMidRear = NULL;
Node *pCur = NULL;
Node *pPre = NULL;
int step = 0;
pCur = head;
while (pCur)
{
pPre = pCur;
pCur = pCur->next;
pPre->next = NULL;
step++;
// pMidHead pMidRear分别指向当前这个interval反序的一头一尾
if (pMidHead == NULL)
{
pMidHead = pPre;
pMidRear = pPre;
}
else
{
pPre->next = pMidHead;
pMidHead = pPre;
}
if (step == N || pCur == NULL)
{
if (pNewRear == NULL)
{
pNewRear = pMidRear; //暂时设定链表尾
pNewHead = pMidHead; //确定新的链表头
}
else
{
pNewRear->next = pMidHead; //把上一次的链表尾的next指向当前的链表头
pNewRear = pMidRear; //设定新的链表尾
}
pMidHead = NULL;
pMidRear = NULL;
step = 0;
}
}
return pNewHead;
}
void printLink(Node *head)
{
if (!head)
return;
Node *pCur = head;
do
{
printf("%d->", pCur->val);
pCur = pCur->next;
}
while (pCur);
printf("NULL\r\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
Node N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12, N13, N14;
N1.val = 1;
N2.val = 2;
N3.val = 3;
N4.val = 4;
N5.val = 5;
N6.val = 6;
N7.val = 7;
N8.val = 8;
N9.val = 9;
N10.val = 10;
N11.val = 11;
N12.val = 12;
N13.val = 13;
N14.val = 14;
N1.next = &N2;
N2.next = &N3;
N3.next = &N4;
N4.next = &N5;
N5.next = &N6;
N6.next = &N7;
N7.next = &N8;
N8.next = &N9;
N9.next = &N10;
N10.next = &N11;
N11.next = &N12;
N12.next = &N13;
N13.next = &N14;
N14.next = NULL;
printLink(&N1);
Node* pNew = revertLinkAt(&N1, 4);
printLink(pNew);
return 0;
}
按一定间隔翻转链表
最新推荐文章于 2020-12-21 13:13:14 发布