翻转部分链表

来源:互联网 发布:nginx 限制ip访问次数 编辑:程序博客网 时间:2024/06/16 03:41

单链表翻转的第二个版本。
题目:Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given1->2->3->4->5->NULL, m = 2 and n = 4,
return1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

思路:仍然使用上一个翻转链表的思想。先定义一个计数器,用两个指针,找到链表翻转的起始地和它的上一个节点pre,记录下这个pre节点,从翻转开始,每一次把当前节点后面的一个节点放到pre后面,如此循环n-m次。

代码:

/** * 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) {        if(head==NULL || head->next==NULL){            return head;        }        ListNode *dummy = new ListNode(-1);        dummy->next = head;        ListNode *pre = dummy;        ListNode *cur = head;        int idx = 1;        while(idx < m){//往后走m-1个,找到翻转的起始点            pre = pre->next;            cur = cur->next;            idx++;        }        for(int i = 0;i < (n-m);i++){//循环n-m次,刚好翻转m到n之间的节点            ListNode *temp = cur->next;            cur->next = temp->next;            temp->next = pre->next;            pre->next = temp;        }        return dummy->next;    }};
原创粉丝点击