链表翻转

来源:互联网 发布:宝日龙梅 知乎 编辑:程序博客网 时间:2024/06/06 03:28

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;}


原创粉丝点击