版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
运行结果: