输入一个单向链表,要求将链表从m到n 逆序。不要开辟额外的空间。
开始题意读错了,以为将m和n两个节点交换位置。结果WA
但是后来一向,这个可以算是逆序的一个步骤,所以代码稍微改了改就AC了,其中额外注意m=1 n-m=1的情况。
class Solution { public: ListNode *reverseBetween(ListNode *head, int m, int n) { int length = GetLengthListNode(head); if(length <= 0 || m >= n || length < n) return head; while(m < n) { head = reverseBetweenStep(head,m,n); m++; n--; } return head; } private: ListNode *reverseBetweenStep(ListNode *head, int m, int n) { if(n-m == 1) { if(m == 1) { ListNode * mlistNode = head; ListNode * nlistNode = GetListNodeFromPos(head,n); ListNode * ntmpnext = nlistNode->next; nlistNode->next = mlistNode; mlistNode->next = ntmpnext; return nlistNode; } else { ListNode * beforem = GetListNodeFromPos(head,m-1); ListNode * mlistNode = GetListNodeFromPos(head,m); ListNode * nlistNode = GetListNodeFromPos(head,n); ListNode * ntmpnext = nlistNode->next; nlistNode->next = mlistNode; mlistNode->next = ntmpnext; beforem->next = nlistNode; return head;<br /> } } if(m == 1) { ListNode * mlistNode = head; ListNode * beforen = GetListNodeFromPos(head,n-1); ListNode * nlistNode = GetListNodeFromPos(head,n); ListNode * ntmpnext = nlistNode->next; nlistNode->next = mlistNode->next; mlistNode->next = ntmpnext; beforen->next = mlistNode; return nlistNode; } else { ListNode * beforem = GetListNodeFromPos(head,m-1); ListNode * mlistNode = GetListNodeFromPos(head,m); ListNode * beforen = GetListNodeFromPos(head,n-1); ListNode * nlistNode = GetListNodeFromPos(head,n);</p> <pre><code> ListNode * mtmpnext = mlistNode-&gt;next; ListNode * ntmpnext = nlistNode-&gt;next; nlistNode-&gt;next = mlistNode-&gt;next; mlistNode-&gt;next = ntmpnext; beforen-&gt;next = mlistNode; beforem-&gt;next = nlistNode; return head; } } ListNode * GetListNodeFromPos(ListNode *head,int pos) { pos--; while(pos--) { head=head-&gt;next; } return head; } int GetLengthListNode(ListNode *listNode) { int Length = 0; while(listNode != NULL) { listNode = listNode-&gt;next; Length++; } return Length; } </code></pre> <p>};