赞
踩
#include<iostream> using namespace std; struct ListNode{ int val; struct ListNode* next; ListNode(int x):val(x),next(nullptr){}; }; /** * struct ListNode { * int val; * struct ListNode *next; * }; */ class Solution { public: /** * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */ ListNode* reverseBetween(ListNode* head, int m, int n) { // write code here ListNode* dummyNode = new ListNode(-1); dummyNode->next = head; ListNode*pre = dummyNode; // 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点 // 建议写在 for 循环里,语义清晰 for(int i = 0;i < m -1;i++){ pre = pre->next; } // 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点 ListNode* rightNode = pre; for(int i = 0; i < n -m + 1;i++){ rightNode = rightNode->next; } // 第 3 步:切断出一个子链表(截取链表) ListNode* leftNode = pre->next; ListNode* cur = rightNode->next; // 注意:切断链接 pre->next = nullptr; rightNode->next = nullptr; //第 4 步:同第 206 题,反转链表的子区间 reverseList(leftNode); //第5步 接回原来的链表 pre->next = rightNode; leftNode->next = cur; dummyNode = dummyNode->next; while(dummyNode){ cout << dummyNode->val << " "; dummyNode = dummyNode->next;//打印反转后的值 } return dummyNode; } void reverseList(ListNode* head){ if(head == nullptr){ return; } ListNode* pre = nullptr; while(head){ ListNode*temp = head->next; head->next = pre; pre = head; head = temp; } } }; int main(){ int val; ListNode* head = new ListNode(0); ListNode* phead = head; while(cin >> val){ ListNode* next_node = new ListNode(val); head = head->next = next_node; } phead = phead -> next; // while(phead){ // cout << phead->val << " "; // phead = phead -> next; // } Solution s; s.reverseBetween(phead, 2, 4); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。