题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
题解:
翻转链表记录当前结点的前一节点pre,临时保存当前结点的下一节点t,然后当前结点的next为pre,pre=当前结点,当前结点=t,这样就达到了翻转的效果。
此题由于不是从头到尾直接翻转,而是只翻转从m->n这些节点,需要注意细节,分情况讨论。
ListNode* reverseBetween(ListNode* head, int m, int n) { //当m==n,说明不用翻转,直接返回 if(m==n) return head; //当前节点 ListNode* tmp = head; //记录m的前一个节点 ListNode* pre_m = NULL; // 记录翻转时所用到的前一个节点 ListNode* pre = NULL; // 记录m节点 ListNode* t_m =NULL; //遍历的节点数 int i=1; while(true) { if(i<m) { pre_m = tmp; tmp = tmp->next; } else if(i==m) { pre = tmp; t_m = tmp; tmp = tmp->next; } else if(i>m&&i<n) { //翻转指针 ListNode* t = tmp->next; tmp->next = pre; pre = tmp; tmp = t; } else if(i==n) { //当pre_m为空说明hh头节点应该指向tmp,否则就是pre_m节点xx指向tmp if(pre_m==NULL) head = tmp; else pre_m->next = tmp; ListNode* t = tmp->next; tmp->next = pre; t_m->next = t; break; } i++; } return head; }