您的位置:首页 > 其它

链表翻转

2017-07-23 23:37 435 查看
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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: