[LeetCode] Reverse Linked List II

本文介绍了一种在原地且仅一次遍历的情况下反转链表中指定区间的算法。通过实例详细解析了如何从位置m到n反转链表,并讨论了不同边界情况的处理方式。
[Problem]

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.


[Analysis]
以题目中的例子说明:用指针begin指向m=2的地方,指针end指向n=4的地方,pre指向begin前面的一个,先调换begin和end,即pre->next = end; begin->next = end->next; 然后reverse链表begin到end之间的元素。
需要注意:
(1)m = n = 1
(2)m = n != 1
(3)m = 1,n = length
尤其要注意,如果begin=1,这个时候,传进来的参数head需要进行更新。

[Solution]

// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

// Definition for Solution
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function

// the list is not empty
if(head != NULL){
ListNode *pre = head;
ListNode *begin = head;
ListNode *end = head;
ListNode *p = head;

// set begin and first
while(p != NULL && (m > 0 || n > 0)){
if(m > 0){
m--;
if(m == 0){
begin = p;
}
else{
pre = p;
}
}
if(n > 0){
n--;
if(n == 0){
end = p;
}
}
p = p->next;
}

// because 1 <= m <= n <= length
// so, the below line can be removed
//assert(m ==0 && n == 0);

// reverse at head
bool atHead = false;
if(pre == begin){
atHead = true;
}

// swap begin and end
ListNode *cur = begin->next;
if(pre != end){
pre->next = end;
}
begin->next = end->next;

// reverse between begin and end
pre = begin;
ListNode *later = cur;
ListNode *last = end->next;
while(cur != NULL && cur != last){
later = cur->next;
cur->next = pre;
pre = cur;

// be careful to set the head
if(atHead){
head = cur;
}

// update cur
cur = later;
}
}
return head;
}
};


 说明:版权所有,转载请注明出处。 Coder007的博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值