Leetcode 92. Reverse Linked List II

题目

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->NULL, m = 2 and n = 4,

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

Note:
Given m, n satisfy the following condition:
1 ? m ? n ? length of list.

分析

将一段链表翻转,由于需要逆向找指针,可能需要多次遍历,但是题目中要求遍历一次,因此可以换一个思路,挨个元素依次插入,比如示例中的:1->2->3->4->5->NULL 将3插入1->之间 1->3->2->4->5->NULL,然后插入4 1->4->3->2->5->NULL.
最后需要注意当m==1时候需要单独处理head指针。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {
    struct ListNode *p=head,*q=head,*temp;
    if(m==1)
    {
        for(int i=0;inext;
            q->next=q->next->next;
            head->next=p;
            p=head;
        }
        return head;
    }
    for(int i=0;inext;
    }
    q=p->next;
    for(int i=0;inext;
        p->next=q->next;
        q->next=p->next->next;
        p->next->next=temp;
    }
    return head;
}

你可能感兴趣的:(Leetcode 92. Reverse Linked List II)