一、题目:
描述
将一个链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。
例如:
给出的链表为 1→2→3→4→5→NULL,返回 1→4→3→2→5→NULL
注意:
给出的 m,n 满足以下条件:
1 <=m <= n <= 链表长度
二、输入输出示例:
三、代码:
方法一:暴力反转
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
ListNode *reverse(ListNode *first,ListNode *last){
ListNode *p1,*p2,*p3;
p1 = NULL;
p2 = first;
while(p2 != last){
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
p2->next = p1;
return p2;
}
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
// write code here
ListNode *mpre,*mnode,*nlast,*nnode;
ListNode *phead = new ListNode(0);
phead->next = head;
mpre = mnode = nlast = nnode = phead;
if(m == n){
return head;
}
for(int i=1;i<m;i++){
mpre = mpre->next;
}
mnode = mpre->next;
for(int i=1;i<=n;i++){
nnode = nnode->next;
}
nlast = nnode->next;
mpre->next = reverse(mnode,nnode);
mnode->next = nlast;
return phead->next;
}
};
方法二:将m到n中的结点查到n结点后面
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
// write code here
ListNode *mpre,*mnode,*nnode;
ListNode *phead = new ListNode(0);
phead->next = head;
mpre = mnode = nnode = phead;
if(m == n){
return head;
}
for(int i=1;i<m;i++){
mpre = mpre->next;
}
mnode = mpre->next;
for(int i=1;i<=n;i++){
nnode = nnode->next;
}
while(mnode != nnode){
mpre->next = mnode->next;
mnode->next = nnode->next;
nnode->next = mnode;
mnode = mpre->next;
}
return phead->next;
}
};