当完全逆置链表时,只用配置好标头,并在另写递归函数逆置链表即可并由主函数调用,程序如下:
ListNode* reverseList(ListNode* head) {
        if(head == NULL) return NULL;
        ListNode* p=head;
        while(p->next!=NULL) p=p->next;
        doReverse(head);
        return p;
    }
    ListNode* doReverse(ListNode* head) {
        if(head->next==NULL) return head;
        ListNode* p=doReverse(head->next);
        p->next = head;
        head->next = NULL;
        return head;
    }
当部分逆置链表时,根据不同情况,修改主函数应对不同情况即可:
ListNode* reverseBetween(ListNode* head, int m, int n) {
        if(head == NULL) return NULL;
        if(m==n) return head;
        ListNode* p1=head;
        for(int i=m; i>2; i--) {
            p1 = p1->next;
        }
        ListNode* q=head;
        for(int i=n; i>1; i--) {
            q = q->next;
        }
        if(m==1) {
            if(q->next==NULL) {
                doReverse(head);
                return q;
            }
            ListNode* q1=q->next;
            q->next = NULL;
            doReverse(head);
            head->next = q1;
            return q;
        }
        else {
            if(q->next == NULL) {
                ListNode* p=p1->next;
                doReverse(p);
                p1->next = q;
                return head;
            }
            ListNode* p = p1->next;
            ListNode* q1 = q->next;
            q->next = NULL;
            doReverse(p);
            p1->next = q;
            p->next = q1;
            return head;
        }
    }
还有比较短的代码实现方法,但我是借鉴别人的,执行速度是差不多的:
ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode *leftI = dummy;
        for(; --m; --n) leftI = leftI->next; 
        ListNode *cur = leftI->next, *rtail = cur, *pre = nullptr;
        while(n--){
            ListNode* nxt = cur->next;
            cur->next = pre;
            pre = cur;
            cur = nxt;
        }
        rtail->next = cur; leftI->next = pre;
return dummy->next;
Reverse Linked List和Reverse Linked List II
原文:http://www.cnblogs.com/xdlyy/p/5391189.html