92. Reverse Linked List II

来源:互联网 发布:月薪5万的程序员 编辑:程序博客网 时间:2024/05/22 00:41

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:

1 ≤ m ≤ n ≤ length of list.


1.我的答案

/** * 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* r = head, *p = NULL, * q = NULL, *temp = NULL;    if(m == n) return head;    int mm = m;    int i = 1;    while(i < m-1){        r = r -> next;        i++;    }    if(m == 1)        p = r;    else        p = r-> next;    q = p -> next;    while(mm < n){        temp = q->next;        q->next = p;        p = q;        q = temp;        mm++;    }    if(m == 1){        head = p;        temp = r;    }    else{        temp = r -> next;        r->next = p;    }    temp -> next = q;    return head;}};

2,别人的答案

ListNode *reverseBetween(ListNode *head, int m, int n) {    if(m==n)return head;    n-=m;    ListNode prehead(0);    prehead.next=head;    ListNode* pre=&prehead;    while(--m)pre=pre->next;            ListNode* pstart=pre->next;    while(n--)    {        ListNode *p=pstart->next;        pstart->next=p->next;        p->next=pre->next;        pre->next=p;    }    return prehead.next;}


0 0
原创粉丝点击