首页 » 编程之美 » 正文

[leetcode_92]Reverse Linked List II

输入一个单向链表,要求将链表从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-&gt;next;
            nlistNode-&gt;next = mlistNode-&gt;next;
            mlistNode-&gt;next = ntmpnext;
            beforen-&gt;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-&amp;gt;next;
        ListNode * ntmpnext = nlistNode-&amp;gt;next;
        nlistNode-&amp;gt;next = mlistNode-&amp;gt;next;
        mlistNode-&amp;gt;next = ntmpnext;
        beforen-&amp;gt;next = mlistNode;
        beforem-&amp;gt;next = nlistNode;
        return head;            
    }
}
ListNode * GetListNodeFromPos(ListNode *head,int pos) {
    pos--;
    while(pos--) {
        head=head-&amp;gt;next;
    }
    return head;
}
int GetLengthListNode(ListNode *listNode) {
    int Length = 0;
    while(listNode != NULL) {
        listNode = listNode-&amp;gt;next;
        Length++;
    }
    return Length;
}
</code></pre>

<p>};

发表评论