本题来源于 leetcode 92 给定 m和n 要求逆序这段区间内的结点 1->2->3->4->5->NULL m=2 n=4; 返回 1->4->3->2->5->NULL
由于本人水平有限,代码冗长,大家可以直接前往leetcoe官网看官解 leetcode 反转链表
我的想法是寻找出 关键的几个结点 m结点 m结点前驱 n结点 n结点后继,然后实现逆序操作具体请看下方代码
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { ListNode *L=new ListNode(); L->next=head; ListNode *pre,*last,*p,*q,*t,*q_r; last=pre=L; int i=0,j=0; while(i<m-1){ //pre指向m的前驱 pre=pre->next; ++i; } while(j<n){ //last 指向n last=last->next; ++j; } t=last->next; //记录n的后继的位置 last->next=NULL; //先置零,便于中间逆序 q=pre->next; //用于中间的逆序操作 q_r=pre->next; //用于最后连接n的后继 pre->next=last; p=q->next; while(q&&p){ //对中间逆序 由于last->next=NULL由此退出循环 ListNode *next; //记录p的后继 next=p->next; p->next=q; //逆序 q=p; //更新 p q p=next; } q_r->next=t; //连接尾部 return L->next; } };