LeetCode 92. Reverse Linked List II ***** 虚拟头结点

来源:互联网 发布:吹笛子软件下载 编辑:程序博客网 时间:2024/05/29 19:04

    • 题目
      • 题意
      • 注意
      • 思路
      • 代码

题目

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.

题意

翻转指定区间的元素,尽管和Reverse Linked List类似,但是还是有本质上区别。

注意

m和n超过链表范围怎么办
m>n怎么办

思路

1.首先建立虚拟头结点的链表
2.找到区间[m,n]的前一个元素m-1
3.在区间内做反转操作。cur指向的区间内的第一个元素,反转cur->next元素。
4.最终的实现效果,不断向pre后插入cur后的元素,直到cur移动到区间末尾。

代码

class Solution {public:    ListNode* reverseBetween(ListNode* head, int m, int n) {        //虚拟头结点        ListNode *new_head = new ListNode(0);        new_head->next = head;        ListNode *pre = new_head;        //1.找到区间内的前一个元素        for(int i=0;i<m-1;i++)        {            pre = pre->next;        }        //2.获取区间内的第一个元素        ListNode *cur = pre->next;        //3.在区间内做反转操作       for(int i=0;i<n-m;i++)       {            ListNode *move = cur->next;            cur->next = move->next;            move->next = pre->next;            pre->next = move;        }        //return head;        return new_head->next;    }};

这里写图片描述

原创粉丝点击