看了网上才想到
分析: 刚开始想one pass 翻转应该是不可能的。 一直没想明白。后来才明白,一个一个的往前就可以实现翻转。
遇到问题可以先将其简化,如果只移一步,是不是就可以了?
最后m=n的情况可以归并起来。
pre 是在 m 的前一个元素。 end 是已经实现倒序部分的最后一个,start 是第一个。 nnew 是还需要排序的元素
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param head, a ListNode
# @param m, an integer
# @param n, an integer
# @return a ListNode
def reverseBetween(self, head, m, n):
if head==None:
return head
prehead = ListNode(10)
prehead.next = head
pre = prehead
for dummy_i in range(m-1):
pre = pre.next
end = pre.next
for dummy_i in range(n-m):
new = end.next
end.next = new.next
start = pre.next
pre.next = new
new.next = start
return prehead.next
C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *reverseBetween(ListNode *head, int m, int n) {
if (head==NULL || m==n){
return head;
}
ListNode *prehead = new ListNode(10);
prehead->next = head;
ListNode *pre = prehead;
for (int i=0;i<(m-1);i++){
pre = pre->next;
}
ListNode *end = pre->next;
ListNode *nnew,*start;
for (int i=0;i<(n-m);i++){
nnew = end->next;
end->next = nnew->next;
start = pre->next;
pre->next = nnew;
nnew->next = start;
}
return prehead->next;
}
};
总结:
1. C++ 中,new 是一个关键字,不能把它当作变量名。