这个题很简单,思考起来:
/** * 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* hHead = new ListNode(-1); hHead->next = head; ListNode* preHead = hHead; ListNode* nowHead = head; for(int i = 1; i < m ;i++ ){ preHead = nowHead; nowHead = nowHead->next; } /** 很关键的一步 **/ for( int i = m ; i < n ; i++){ ListNode* temNode = nowHead->next; @1 nowHead->next = temNode->next; @2 temNode->next = preHead->next; @3 preHead->next = temNode; @4 } return hHead->next; } };
关键步骤:
在这里,就这个题而论,思考这个循环,关键的是记住,preHead,nowHead位置都没有变。
这里就循环了两次
第一次循环,链表变成了1->3->2->4->5->null
详细过程:preHead:1 nowHead:2
@1:将2的下一个指向的数字3的地址赋给临时节点temNode
@2:将3的下一个指向的数字4的地址赋给nowHead的next指针,也就是将2指向4
@3:将1的下一个指向的数字2的地址赋给temNode的next指针,也就是将3指向2
@4:将preHead的next指针指向3,也就是1指向3
第二次循环,链表变成了1->4->3->2->5->null
详细过程:preHead:1 nowHead:2
@1:将2的下一个指向的数字4的地址赋给临时节点temNode
@2:将4的下一个指向的数字5的地址赋给nowHead的next指针,也就是将2指向5
@3:将1的下一个指向的数字3的地址赋给temNode的next指针,也就是将4指向3
@4:将preHead的next指针指向3,也就是1指向4