【每日刷题】反转链表 II

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sd4567855/article/details/87890772

day39 反转链表 II

题目来源:leetcode

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明: 1 ≤ m ≤ n ≤ 链表长度。

示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

解答:这个逻辑的关键一点在于如何一趟扫描。
首先先移动到第m个结点处,然后开始向后走,边向后边反转,该过程主要做法是将目前的结点移动到第m-1个结点之后。

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
 
ListNode* reverseBetween(ListNode* head, int m, int n) {
        //添加头结点,方便运算
        ListNode* Head = (ListNode *)malloc( sizeof( struct ListNode));
        Head->next = head;
        
        //首先让 start 走到第m个结点
        ListNode* start = Head;
        ListNode* pre;
        int temp = m;
        while( start &&temp--){
            pre = start;
            start = start->next;
        }
        
        //边走向第n个结点,边反转 
        temp = n - m;
        ListNode* now = start->next, * temp_next;
        while( temp-- ){
            //旋转
            //每次旋转都将now位置上的结点放到pre之后
            temp_next = now->next;
            now->next = pre->next;
            start->next = temp_next;
            pre->next = now;
            //移动
            now = temp_next; 
            
        }
    
        return Head->next;
    }

运行结果:屏幕快照 2019-02-23 12.16.58.png-35.4kB


我的微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sd4567855/article/details/87890772