链表翻转。给出一个链表和一个数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。
思路:分开旋转再合并
先写旋转的函数
前闭后开,从pHead到pEnd-1的旋转
ListNode* ReverseList(ListNode * pHead,ListNode* pEnd)
{
ListNode* pNewHead = NULL;
ListNode* pPre = NULL;
ListNode* pCur = pHead;
while(pCur != pEnd)
{
ListNode* pNext = pCur->Next;
if(pNext == pEnd)
pNewHead = pCur;
pCur->Next = pPre;
pPre = pCur;
pCur = pNext;
}
return pNewHead;
}
K个链表的旋转
ListNode* KReverseList(int k,ListNode* pHead)
{
ListNode* pReverseListHead = NULL;
ListNode* pReverseListTail = NULL;
int index = 0;
ListNode* pStart = pHead;
ListNode* pEnd = pHead;
//因为逆置的是pHead到pEnd-1,所以这里i<K
for(int i = 0;i<k;i++)
{
pEnd = pEnd->Next;
if(pEnd == NULL)
break;
}
//这里改变尾指针,并把下一次反转的头给pStart
pReverseListHead = ReverseList(pStart,pEnd);
pReverseListTail = pStart;
pStart = pEnd;
//
while(1)
{
if(pEnd == NULL)
break;
pEnd = pEnd->Next;
++index;
if(index%k == 0){
ListNode* pTemp = ReverseList(pStart,pEnd);
pReverseListTail->Next = pTemp;
pReverseListTail = pStart;
pStart = pEnd;
}
}
//也就是说链表的个数为K的倍数,最后一个end为NULL
if(pStart != NULL)
pReverseListTail->Next = pStart;
return pReverseListHead;
}