其实我以前还是挺怕做链表的题目的,但是熟能生巧之后还是会理解一些,不要怕指针太多弄的自己搞不清楚在干什么;
首先还是制造一个哨兵伪节点来避免头节点的分类讨论
然后找到反转节点前一个位置的节点用pre指过去
再者,就是运用头插法来反转链表了,pre后面是cur,这里需要不断地把cur后面的节点移动到
pre后面来,这个时候需要一个临时指针来操作后面这个节点temp,这个操作需要进行n-m+1次
每次操作后都是一条完整的链表,进行上述操作完成后就实现了m-n区间的链表反转了
/** * 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* dummy = new ListNode(0); dummy->next = head; ListNode* pre = dummy, * cur = head; for (int i = 1; i < m; i++) { pre = pre->next; } cur = pre->next; for (int i = 0; i < n - m; i++) { ListNode* temp = cur->next; cur->next = cur->next->next; temp->next = pre->next; pre->next = temp; } return dummy->next; } };