1、给出一个链表和一个数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。
2、实现代码
#include<iostream>
#include<assert.h>
using namespace std;
typedef struct ListNode{
int _value;
struct ListNode *Next;//指向下一个节点
struct ListNode* _random;//指向任意节点或者空节点
ListNode(int value, ListNode* next = NULL)
:_value(value)
,Next(next)
{}
};
ListNode* ReceiveList(ListNode* pHead)//头插逆置单链表
{
ListNode* pNewNode = NULL;
ListNode* pCur = pHead;
ListNode* pTemp = pHead;
//链表为空或者链表只有一个结点返回该节点
if (NULL == pHead || NULL == pHead->Next)
return pHead;
while (pTemp)
{
pTemp = pCur->Next;
pCur->Next = pNewNode;
pNewNode = pCur;
pCur = pTemp;
}
return pNewNode;
}
ListNode* part_reverse(ListNode* pHead, int length, int k)
{
if (pHead == NULL || k <= 1 || k > length)
return pHead;
ListNode* pHead1 = pHead;
ListNode* pCur = NULL;
int idx = 1;
while (pHead1 && idx < k)
{
pHead1 = pHead1->Next;
idx++;
}
pCur = pHead1;
pHead1 = pHead1->Next;
pCur->Next = NULL;
pCur = ReceiveList(pHead);
ListNode* pHead2 = part_reverse(pHead1, length - k, k);
pHead->Next = pHead2;
return pCur;
}
void pRintList(ListNode* pHead)
{
if (NULL == pHead)
cout << "空链表" << endl;
else
{
while (pHead->Next)
{
cout << pHead->_value << " ";
pHead = pHead->Next;
}
cout << pHead->_value<<" ";
}
cout << "NULL" << endl;
}
int main()
{
ListNode* pHead1 = new ListNode(1);
ListNode* pCur = pHead1;
for (int i = 2; i < 10; i++)
{
ListNode* tmpNode = new ListNode(i);
pCur->Next = tmpNode;
pCur = tmpNode;
}
pRintList(pHead1);
ListNode*pNew = part_reverse(pHead1, 9, 2);
pRintList(pNew);
system("pause");
return 0;
}